ios - 我可以使用类别和运行时向 UIScrollView 添加一个 BOOL 类型属性 "isScrolling"吗?

标签 ios objective-c uiscrollview runtime categories

我过去常常向 UIButton 添加一个 NSString * 类型属性,但是今天,我想添加一个 BOOL 类型属性 isScrollingUIScrollView 以指示 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

错误是: enter image description here

有什么方法可以处理这些错误吗?我们可以使用类别和运行时来实现向 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/

相关文章:

ios - 将平移手势添加到 UICollectionView 单元格 - IOS/Swift

objective-c - 将 'float' 转换为 NSNumber 的精度丢失,返回到 'float'

c++ - Cocos2D + Box2D : A lot of parse issues when running on device

iphone - UIButton 文本大小问题

ios - Xamarin iOS - UIScrollView 内的 UIImageView 在方向改变后移位

objective-c - 关于在 iOS 中旋转 map

objective-c - 滚动表格 View 时未选中复选标记

ios - 处于横向模式并点击返回后强制纵向模式

ios - 增加 UIScrollView 橡皮筋阻力

ios - 如何使 uitextview 不可滚动但显示所有内容