我过去常常向 UIButton
添加一个 NSString *
类型属性,但是今天,我想添加一个 BOOL
类型属性 isScrolling
到 UIScrollView
以指示 scrollView 是否以相同的方式滚动但显示有问题,这是我的代码:
#import <UIKit/UIKit.h>
@interface UIScrollView (Util)
@property (nonatomic,assign) BOOL isScrolling;
@end
#import <objc/objc-runtime.h>
@interface UIScrollView ()<UIScrollViewDelegate>
@end
@implementation UIScrollView (Util)
static void *strKey = &strKey;
- (void)setIsScrolling:(BOOL)isScrolling{
objc_setAssociatedObject(self, & strKey, isScrolling, OBJC_ASSOCIATION_ASSIGN);
}
- (BOOL)isScrolling{
return objc_getAssociatedObject(self, &strKey);
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
self.isScrolling = YES;
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
self.isScrolling = NO;
}
@end
有什么方法可以处理这些错误吗?我们可以使用类别和运行时来实现向 UIScrollView
添加 BOOL
属性以指示 scrollView 是否为滚动?
希望有人能给我一些建议,非常感谢。
最佳答案
关联对象 必须就是那个对象,因此非对象 BOOL
类型的值将不起作用,除非包装为对象。幸运的是,这很容易:
- 在对
objc_setAssociatedObject
的调用中,将isScrolling
更改为@(isScrolling)
并将OBJC_ASSOCIATION_ASSIGN
更改为OBJC_ASSOCIATION_RETAIN_NONATOMIC
。这将创建并传递一个NSNumber
对象,第二个更改要求将该对象的生命周期与第一个参数self
的生命周期相关联。 - 在
isScrolling
中将objc_getAssociatedObject(self, &strKey)
更改为[objc_getAssociatedObject(self, &strKey) boolValue]
。这将从存储的NSNumber
对象中提取BOOL
值。
HTH
关于ios - 我可以使用类别和运行时向 UIScrollView 添加一个 BOOL 类型属性 "isScrolling"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44643880/