7

我有一个如下所示的块属性:

@property (nonatomic, copy) void (^indexChangeBlock)(NSInteger index);

当我尝试设置此属性的值时,Xcode 自动完成将省略参数名称,留下如下内容:

[self.segmentedControl3 setIndexChangeBlock:^(NSInteger) {
    code
}];

然后 Xcode 显示Parameter name omitted错误。我知道我可以通过手动添加参数名称来解决这个问题,使其看起来像这样:

[self.segmentedControl3 setIndexChangeBlock:^(NSInteger index) {
    code
}];

我的问题是,如何让 Xcode 自动添加参数名称。或者换句话说,阻止它删除它们。

4

2 回答 2

3

可能的解决方案:

typedef void (^IndexChangeBlock)(NSInteger index);

并定义您的财产

@property (nonatomic, copy) IndexChangeBlock indexChangeBlock;

如果你添加

- (void)setIndexChangeBlock:(IndexChangeBlock)indexChangeBlock;

一切都应该工作

于 2013-01-21T14:09:34.170 回答
1

在更加沮丧的情况下,我做了一个宏观巩固这个粗略的过程..

#define BlockProperty(SIGNATURE,TYPENAME,varname,Varname) typedef SIGNATURE; @property (nonatomic,copy) TYPENAME varname; - (void) set##Varname:(TYPENAME)_

现在以前需要什么(正确的自动完成)..

typedef void(^OnEvent)(BOOL ok,id result);
@property (nonatomic,copy) OnEvent varname;
- (void) setVarname:(OnEvent)_;

简直就是

BlockProperty(void(^OnEvent)(BOOL ok, id result),OnEvent,varname,VarName);

相当简单,不那么冗长,并且您可以获得 typedef AND 的好处,并且您不必创建难看的、理论上不需要的 setter 声明!

如果你想重用一个“类型”,你需要另一个(这一次只需要三个参数(因为块类型不能重新声明)。

#define BlockProp(TYPENAME,varname,Varname) @property (nonatomic,copy) TYPENAME varname; - (void)  set##Varname:(TYPENAME)_

BlockProp(OnEvent,anotherVar,AnotherVar);

即使它们的签名匹配(使用第一个宏),您也可以为每个属性创建一个新的块类型(名称),但这有点恶心。享受!

于 2014-09-30T05:20:10.250 回答