【问题标题】:Update UILabel text when a NSString is changed in another class在另一个类中更改 NSString 时更新 UILabel 文本
【发布时间】:2012-11-12 21:59:39
【问题描述】:

我有一个带有NSStringsUIImagesNSObject 课程。我通过从服务器下载数据来填充它们。我在管理器类中所做的,我下载一个 JSON 并将其解析为 NSObject 以填充基本的 NSStringUIImages。然后我在NSObject 的类中启动一个方法,从另一台服务器下载更复杂的数据并将NSObject 放入NSMutableDictionary。所以我最终得到的是一本包含我的NSObjects 的字典,其中一些数据已经下载,一些数据仍在下载。

然后我尝试将NSObject 的数据输入UILabels 和另一个类(视图控制器)中的UIImageViews。但是,某些数据可能仍会加载,因此 UILabel 将显示为空,例如,如果应该填充它的 NSString 尚未下载。

现在我的问题是,一旦下载(重新设置)NSString 中的NSString 类,如何再次更改UILabels 的文本?基本上我需要从UILabel 的类中“观察”NSObjectNSString 的值。我发现了这样的东西:

observeValueForKeyPath:ofObject:change:context

但我不知道如何使用它。我知道我必须在UILabel 的类中实现它,但是当它观察到NSObject 的@987654345 发生变化时,如何以及如何设置它以更新UILabel 的文本@?

我也读过一些关于NSObjectController 类的内容,它适用于这里吗?

提前谢谢你!

【问题讨论】:

    标签: iphone ios nsstring uilabel nsobject


    【解决方案1】:

    基本上你需要在你的UILabel子类中实现以下内容:

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        if ([keyPath isEqualToString:@"nameOfThePropertyInYourNSObjectSubclass"]) {
            id changedValue = [object valueForKeyPath:keyPath];
            //do what ever you want with it
        }
    }
    

    还要为 KVO 注册您的 NSObject 子类,您需要实现:

    [self addObserver:yourUILabel forKeyPath:@"nameOfThePropertyOfYourString" options:NSKeyValueObservingOptionNew context:NULL];
    

    请注意,您还必须在适当的时候取消注册观察者(取决于您的设计):

    [self removeObserver:yourUILabel forKeyPath:@"nameOfThePropertyOfYourString" context:NULL];
    

    另外请注意,虽然 KVO 是一个简洁的东西,并且在某些情况下非常有用,但选择它并不是一件容易的事。特别是在您的情况下,我建议您改用回调。从网络获取数据最好在后台线程中完成,在这种情况下,我会使用委托模式来通知您的视图控制器,新数据可用并让视图控制器负责更新您的标签。

    【讨论】:

    • 好的,但是当我有多个 NSObject 并且我想将它们的数据提供给 UITableView 时,它仍然可以工作吗?如何确保一个 NSString 真正连接到那个 UILabel?那么委托方法是什么呢?
    • 看看各种苹果委托模式。例如目标-动作模式。您可以将多个UIButtons 连接到一个IBAction。然后每个UIButton 将自己作为参数传递给回调,因此委托可以决定要做什么。当您设置NSObjects 时,您可以保留一个额外的NSDictionary,将对象连接到UILabels。看看Cocoa Design Patterns真的值得一看
    • 嗯好吧...所以基本上 NSObject 将是占位符视图的代表(可以说是 UITableViewCell 或 UIView)。但我仍然不清楚,如何从包含许多它们的大字典中告诉特定的 NSObject 是显示它的数据的特定 Cell/View 的代表?
    • 而且 -> 视图将是可重用的。当你点击一个 MKAnnotationView 作为 UIPopover 时,可能会显示 NSObject 的数据。
    • 总是可以选择为每个 NSObject 创建一个 UITableViewCell(呈现在 UITableVIew 中)和 UIViewController(呈现在 mapView 中的 UIPopover 中)。或者直接在 NSObject 类中创建两个 UIView 实例,一个用于 tableView,一个用于 mapView 弹出窗口。视图将包含标签布局等。如果我找不到以更可重用的方式执行此操作的方法,我可能会选择最后一个选项...
    【解决方案2】:

    你已经很接近了——你想要的叫做键值观察,在Key-Value Observing Programming Guide中有详细描述。为此,您不需要 NSObjectController - 相反,让管理 UILabel 视图的视图控制器将自己添加为其他类的观察者,然后在收到 observeValueForKeyPath:ofObject:change:context 消息时更新 UILabel 文本。

    【讨论】:

      【解决方案3】:

      KVO 是可能的,但也可以查看 delegate 模式。我相信这里会更简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-02
        • 2017-09-24
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多