我有一段代码在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
方法不再被调用)?
答案 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...
});
并且像魅力一样工作