从TextFieldOnEditingDidEnd中调用BecomeFirstResponder时,iOS 6.1中的StackOverflow

时间:2014-05-25 18:01:26

标签: ios ios7 ios6 uitextfield becomefirstresponder

我试图通过我的应用程序变得聪明。

我有5个UITextField个对象堆叠在一起。我希望用户能够在第一个UITextField中输入内容,然后按下'下一步'在键盘上,焦点移动到下一个UITextField

我的策略是拥有一系列UITextField个对象,当TextFieldOnEditingDidEnd被调用时,我会调用' BecomeFirstResponder()'在当前所选UITextField之后显示的文本字段上。

此策略在ios 7.x上运行正常,但是,它会在ios 6中导致堆栈溢出。

所以,我想知道我是否打电话给' BecomeFirstResponder()'正在强制TextFieldOnEditDidEnd()在我刚刚作为第一响应者的文本字段上调用。

是否有人知道BecomeFirstResponder()的来电是否强制拨打TextFieldOnEditDidEnd()?此外,此行为是否已从iOS 6.x更改为iOS 7.x?

感谢

2 个答案:

答案 0 :(得分:1)

不完全回答你的问题,但另一个解决方法是:

tag上设置textFields。从表单1,2,3开始...然后,在代码中,实现textFieldShouldReturn:,如下所示:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    UIView * nextView = [textField.superview viewWithTag:textField.tag+1];
    if ([nextView respondsToSelector:@selector(becomeFirstResponder)])
        [nextView becomeFirstResponder];
    return NO;
}

答案 1 :(得分:1)

适用于iOS 6和iOS 7的解决方案是使用延迟性能。在TextFieldOnEditingDidEnd,请勿直接致电becomeFirstResponder;相反,在一个dispatch_after函数调用中调用它只需很短的延迟。这将允许第一个方法在第二个方法开始之前结束,从而打破无限循环。