gpt4 book ai didi

ios - 使用类别中的 block 扩展 UIRefreshControl

转载 作者:行者123 更新时间:2023-11-29 13:02:49 25 4
gpt4 key购买 nike

我真的很喜欢 block 的工作方式,并且认为将它们添加到一些地方会很好,比如为 UIRefreshControl 设置操作。

所以我创建了一个 categoryUIRefreshControl

@interface UIRefreshControl (Blocks)

@property (nonatomic, copy) void (^actionBlock)();

- (id)initWitActionBlock:(void (^)())actionBlock;

@end

@implementation UIRefreshControl (Blocks)

- (id)initWitActionBlock: (void (^)())actionBlock {
self = [super init];
if (self) {
self.actionBlock = [actionBlock copy];
[self addTarget:self action:@selector(fireActionBlock) forControlEvents:UIControlEventValueChanged];
}
return self;
}

- (void)fireActionBlock {
self.actionBlock();
}

@end

正在崩溃:原因:'-[UIRefreshControl setActionBlock:]:发送到实例的无法识别的选择器

但我真的不太了解 block ,而且我也没有真正看到这个 category 和做同样事情的 subclass 之间的区别。

我想我不完全了解属性发生了什么,所以我的问题是我应该怎么做?如果可能的话,这样可以吗?或者也许我永远不应该这样做?

编辑: *带有相关引用的解决方案感谢@Martin R!

static char const * const ActionBlockKey = "ActionBlockKey";

@interface UIRefreshControl (Blocks)

@property (nonatomic, copy) void (^actionBlock)();

- (id)initWitActionBlock:(void (^)())actionBlock;

@end

@implementation UIRefreshControl (Blocks)
@dynamic actionBlock;

- (id)initWitActionBlock: (void (^)())actionBlock {
self = [super init];
if (self) {
self.actionBlock = [actionBlock copy];
[self addTarget:self action:@selector(fireActionBlock) forControlEvents:UIControlEventValueChanged];
}
return self;
}

- (void)fireActionBlock {
self.actionBlock();
}

- (id)actionBlock{
return objc_getAssociatedObject(self, ActionBlockKey);
}

- (void)setActionBlock:(void (^)())actionBlock{
objc_setAssociatedObject(self, ActionBlockKey, actionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

@end

最佳答案

问题与 block 无关。

编译器综合类类别中定义的属性,因为那需要相应的实例变量,并且您不能在类类别中添加实例变量

实际上你应该得到这样的警告

property 'actionBlock' requires method 'actionBlock' to be defined - use @dynamic or provide a method implementation in this category

我建议改为创建一个子类。

关于ios - 使用类别中的 block 扩展 UIRefreshControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19383170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com