将第一响应者从uitextfield更改为uitextview时的死锁[iOS 7]

时间:2013-09-21 16:12:05

标签: ios uitextfield uitextview ios7

这里有一个非常奇怪的问题,这在iOS 7之前没有发生......

我在我创建的表单中有一个uitextfield和uitextview ...问题是,如果用户将文本字段作为第一响应者然后点击uitextview,则发生死锁,内存将增加,直到看门狗杀死我的应用程序。

当我从uitextview更改为uitextfield

时,不会发生这种情况

相关代码:

#pragma mark - UITextView Delegate
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

if ([text isEqualToString:@"\n"]) {
    [textView resignFirstResponder];
}

NSUInteger newLength = [textView.text length] + [text length] - range.length;

return (newLength > 120) ? NO : YES;

}

-(void)textViewDidEndEditing:(UITextView *)textView {

if (textView.tag == CreatePlaceElementDescription) {
    self.marker.info = textView.text;
}
else if (textView.tag == CreatePlaceElementAddress) {
    self.marker.address = textView.text;
}
}

#pragma mark - UITextField Delegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

if ([string isEqualToString:@"\n"]) {
    [textField resignFirstResponder];
}

NSUInteger newLength = [textField.text length] + [string length] - range.length;

//Limit name textfield length
return (newLength > 60) ? NO : YES;
}

-(void)textFieldDidEndEditing:(UITextField *)textField {

if (textField.tag == CreatePlaceElementName) {
    self.marker.name = textField.text;
}

}

除此之外没有其他事情......

如果我首先辞职第一响应者,这个问题不会发生,但它会让用户点击textview两次,这是不希望的..

此外,textview上发生了死锁:didEndEditing,(就好像textview是辞退键盘的那个而不是textfield,textfield:didEndEditing也被调用了).. textview:didEndEditing不应该在任何地方调用

它真的令人难以置信......有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我只是通过在DAKeyboardControl.m中修改方法inputKeyboardDidShow来设法修复它,如下所示:

- (void)inputKeyboardDidShow
{
    // Grab the keyboard view
    if(self.keyboardActiveInput.inputAccessoryView.superview){
        self.keyboardActiveView = self.keyboardActiveInput.inputAccessoryView.superview;
        self.keyboardActiveView.hidden = NO;
    }

    // If the active keyboard view could not be found (UITextViews...), try again
    if (!self.keyboardActiveView) {
        // Find the first responder on subviews and look re-assign first responder to it
        [self reAssignFirstResponder];
    }
}

答案 1 :(得分:0)

好的我有什么问题

我正在使用DaKeyboardControl在键盘出现时调整视图...奇怪的是,在更改第一响应者时,它似乎在iOS 7上被破坏(当只有一个textview / textfield存在时,它不会进入死锁状态)...我正在向他们的githubs打开一个BUG报告,而我知道哪条线产生了这个错误......当我拥有它时,我将与你一起编辑它

编辑:问题出现在UIKeyboardWillShowNotification接收器上......这个通知被多次调用......似乎是使用UIKeyboardDidChangeFrameNotification或UIKeyboardWillChangeFrameNotification来执行框架更改...

我希望这可以帮助某人......不知道UIKeyboardWillShowNotification的使用是否会给不使用iOS 7的人带来问题