我注意到UITextView
有一种奇怪的行为。
当注册UITextViewTextDidChangeNotification
时,每次按键都会调用两次回调。
委托回调textViewDidChange:(UITextView *)textView
只能正确调用一次。
有没有人注意到同样的事情?我真的只是在回调中添加一个观察者到默认UITextView
和YES
,我正在检查发送通知的UITextView
是否是我创建的那个(我只是在我的测试项目中有1个。)
对于那些真正需要一些代码的人来说:
UITextView *textView = [[UITextView alloc] initWithFrame:textViewFrame];
[self.view addSubview:textView];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textDidChange:)
name:UITextViewTextDidChangeNotification
object:nil];
就是这样。
textDidChange:在每次按键时调用两次。
BIG EDIT
我很抱歉让你感到困惑。我应该清除我正在添加UITextView本身作为观察者。
示例代码也是错误的,对不起。
正确的示例代码是:
- (instancetype)init
{
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textDidChange:)
name:UITextViewTextDidChangeNotification
object:nil];
}
}
如果我将textView本身添加为此通知的观察者,是否会调用它为什么会被调用两次?
答案 0 :(得分:0)
大多数时候,关于你的代码,如果它在viewDidAppear或viewDidLoad中,并且你释放了这个UIViewController但是“不”取消注册观察者,它将是活跃的,这是它的潜在原因被叫2次。看一看,确保正确移除观察者。 它也可能发生,你隐藏视图或其他什么,每次视图可见时添加观察者,这可能是一个问题。我建议在viewDidAppear中注册事件,不要忘记删除dealloc中的观察者。
答案 1 :(得分:0)
您是否继承UITextView?如果是这样,请检查是否要创建多个类的实例,从而创建多个观察者。
在UITextView子类的init方法中设置断点。如果它被多次击中,那么你的textDidChange处理程序将被多次调用。
要修复,您可以在处理程序方法中检查UITextView的每个实例:
if let textView = notification.object as? MyTextViewSubClass where textView === self {
print(textView.text)
}