UITextViewTextDidChangeNotification调用两次

时间:2014-06-16 14:22:12

标签: ios objective-c uikit uitextview

我注意到UITextView有一种奇怪的行为。

当注册UITextViewTextDidChangeNotification时,每次按键都会调用两次回调。

委托回调textViewDidChange:(UITextView *)textView只能正确调用一次。

有没有人注意到同样的事情?我真的只是在回调中添加一个观察者到默认UITextViewYES,我正在检查发送通知的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本身添加为此通知的观察者,是否会调用它为什么会被调用两次?

2 个答案:

答案 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)
}