我有一个UITableViewCell ProductsCell
,我在一个笔尖中注册它,然后出列使用它。
我想设置readonly的属性。怎么做得更好?
以下是代码:
@property (nonatomic, strong, readonly) MyProductsVC * targetMyProductsVC;
- (MyProductsVC *)targetMyProductsVC{
if(!_targetMyProductsVC){
UIResponder *target = self.nextResponder;
do {
target = target.nextResponder;
} while (![target isKindOfClass: ZBMyProductsVC.self] && target != nil);
_targetMyProductsVC = (ZBMyProductsVC *)target;
}
return _targetMyProductsVC;
}
我无法实施。在-init
,-awakeFromNib
中,因为我使用UIResponder
来查找父ViewController。
因为在上面的方法中,单元格似乎还没有添加到超级视图上。
如果我喜欢这个,
@property (nonatomic, strong, readonly) MyProductsVC * targetMyProductsVC;
Xcode报告:
使用未声明的标识符'_targetMyProductsVC'
设置两个属性是可以的。一个像上面一样,只需在getter
方法之外设置另一个只读属性(return
以前的属性。)
它有点脏,
更好的方法吗?
代码可以工作:
@property (nonatomic, strong, readonly) MyProductsVC * targetMyProductsVCReadOnly;
@property (nonatomic, strong) MyProductsVC * targetMyProductsVC;
- (MyProductsVC *)targetMyProductsVC{
if(!_targetMyProductsVC){
UIResponder *target = self.nextResponder;
do {
target = target.nextResponder;
} while (![target isKindOfClass: ZBMyProductsVC.self] && target != nil);
_targetMyProductsVC = (ZBMyProductsVC *)target;
}
return _targetMyProductsVC; }
- (MyProductsVC *)targetMyProductsVCReadOnly{
return self.targetMyProductsVC; }
答案 0 :(得分:2)
因为您正在为readonly
属性实现自己的属性getter,这意味着只有一个访问器(即没有setter),编译器不会自动声明支持变量。来自Encapsulating Data:
注意:编译器会在所有情况下自动合成一个实例变量,它也会合成至少一个存取方法。如果为
readwrite
属性实现getter和setter,或者为readonly
属性实现getter,编译器将假定您正在控制属性实现并且不会合成实例自动变量。如果您仍需要实例变量,则需要请求合成:
@synthesize property = _property;
在getter实现之前插入上述内容以解决未声明的变量错误。
HTH