重写属性以使其从子类成为只读

时间:2013-11-03 19:54:21

标签: objective-c cocoa-touch inheritance override declared-property

我希望以这样一种方式对UILabel进行子类化,使得该类的用户无法直接通过text设置label.text = @"foo"。相反,我想根据一些值从子类内部设置文本。

我尝试了什么:

BalanceLabel.h:

@interface BalanceLabel : UILabel
@property(nonatomic,copy, readonly)   NSString *text;
@end

但是,我收到一条警告,告诉我我正在限制text访问权限(就像我想的那样),但如果我尝试直接使用text设置,则不会出现任何编译时错误我的子类的一个对象。

2 个答案:

答案 0 :(得分:3)

你不能这样做。作为一个简单的例子,为什么不这样做,只需考虑下面的代码应该如何表现:

UILabel *label = [[BalanceLabel alloc] init];
label.text = @"string";

该代码创建BalanceLabel,但将其存储在UILabel类型的变量中,这意味着.text属性的后续设置无法知道您是否尝试制作该属性只在BalanceLabel中显示。

不幸的是,你无能为力。您可以覆盖setter以抛出异常,这将让用户知道他们做错了什么,但当然也会使应用程序崩溃。

答案 1 :(得分:1)

您应该将逻辑放入管理视图的控制器中,而不是直接查看。

  • 我假设您有一些使用新值更新的视图,并且您希望根据这些新值更新BalanceLabel
  • 您的控制器是您的视图的委托,因此它从应用程序的用户或其他模块接收新值,这些模块填充了新值(例如从文件加载,从网络下载等)。
  • 您的控制器然后确定哪些位视图需要更新并设置新值 - 在您的情况下计算余额,我假设