iOS 8 - UILabel观察者没有调用文本的更改

时间:2014-10-11 14:50:24

标签: iphone ios8 uilabel

我有一段代码在iOS 7之前完美运行,但现在,iOS 8无法再运行了。 我有一个UILabel,我有一个类,可以观察其文本中的任何变化。设置如下..

[lcdLabel addObserver:self
               forKeyPath:@"text"
                  options:NSKeyValueObservingOptionNew| NSKeyValueObservingOptionOld
                  context:NULL];

这就是我注册更改的方式。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
     //other code related to observation goes here
}

有关iOS停止工作原因的任何帮助(observeValueForKeyPath方法不再被调用)?

2 个答案:

答案 0 :(得分:2)

首先,我在UILabel的文本属性上实现了一个非常基本的键值观察(KVO)示例,它在iOS 7和iOS上都能保持一致。 iOS 8.因此,您可能只是错误地显示了未显示的代码。

话虽如此,我认为KVO不是响应lcdLabel.text属性更改的最佳方法。

Apple的KVO文件明确指出:

注意:虽然 UIKit框架的类通常不支持KVO ,但您仍然可以在应用程序的自定义对象中实现它,包括自定义视图。< / p>

此外,UILabel的文档未提及text属性的KVO合规性。因此,我认为你不应该依赖这种方法。

与UITextField不同,UILabel的text属性在没有专门设置的情况下永远不会改变,你可以简单地继承UILabel并覆盖setText方法。

- (void)setText:(NSString *)text {
    _text = text;
    // other code related to observation goes here
    // or call back to the UIViewController via a delegate through a custom protocol
}

您可能还想覆盖setAttributedText。

答案 1 :(得分:0)

这里有同样的问题。我无法从委托方法更改UILabel.text。触发该方法,但UILabel未更新或屏幕刷新... 我正在使用SWIFT ...尝试实施NSNotification中心 - 同样的问题...... 发现我从完成处理程序块调用委托方法,但它无法更新UIlabel,因为它必须在主线程上完成。

添加了:

dispatch_async(dispatch_get_main_queue(){

                ... update label...
            });

并且像魅力一样工作