如何以只读方式设置UICollectionViewCell的属性

时间:2018-01-02 14:58:10

标签: ios objective-c uitableview readonly

我有一个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; }

1 个答案:

答案 0 :(得分:2)

因为您正在为readonly属性实现自己的属性getter,这意味着只有一个访问器(即没有setter),编译器不会自动声明支持变量。来自Encapsulating Data

  

注意:编译器会在所有情况下自动合成一个实例变量,它也会合成至少一个存取方法。如果为readwrite属性实现getter和setter,或者为readonly属性实现getter,编译器将假定您正在控制属性实现并且不会合成实例自动变量。

     

如果您仍需要实例变量,则需要请求合成:

@synthesize property = _property;  

在getter实现之前插入上述内容以解决未声明的变量错误。

HTH