【问题标题】:Override a property to make it read-only from the subclass覆盖属性以使其在子类中为只读
【发布时间】:2013-11-03 19:54:21
【问题描述】:

我想继承UILabel,这样类的用户就不能直接通过label.text = @"foo"设置text。相反,我想根据某些值从子类内部设置文本。

我尝试了什么:

BalanceLabel.h:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    该代码创建了一个BalanceLabel,但将其存储在UILabel类型的变量中,这意味着.text属性的后续设置无法知道您试图在@987654325中使该属性只读@。

    很遗憾,您对此无能为力。您可以重写 setter 以引发异常,这会让用户知道他们做错了什么,但当然也会导致应用崩溃。

    【讨论】:

    • 这完全有道理。不过没关系...我只能接受我不能这样做 =)
    【解决方案2】:

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

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

    【讨论】:

    • 实际上,我只想制作一些标签,例如日期标签、余额标签等,因此我不必在代码中的任何地方都放置此类标签的格式。例如,一个 DateLabel 将有一个 setDate:(NSDate*) 日期方法,该方法将格式化日期并在解析后正确设置字符串等等。我只是想避免在我需要在许多屏幕上执行此操作时使用 NSDateFormatter 或类似的东西。不过谢谢你的想法! =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2010-12-02
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多