iOS 6.1 中的 *** 从 TextFieldOnEditingDidEnd 内部调用成为第一响应者时

Posted

技术标签:

【中文标题】iOS 6.1 中的 *** 从 TextFieldOnEditingDidEnd 内部调用成为第一响应者时【英文标题】:*** in iOS 6.1 when calling BecomeFirstResponder from inside TextFieldOnEditingDidEnd in 【发布时间】:2014-05-25 18:01:25 【问题描述】:

我正在努力让我的应用变得聪明。

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

我的策略是拥有一个 UITextField 对象数组,当 TextFieldOnEditingDidEnd 被调用时,我会在当前选定的 UITextField 之后出现的文本字段上调用“BecomeFirstResponder()”。

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

所以,我想知道我调用“BecomeFirstResponder()”这一事实是否会迫使TextFieldOnEditDidEnd() 在我刚刚进入第一响应者的文本字段中被调用。

是否有人知道对BecomeFirstResponder() 的调用是否会强制对TextFieldOnEditDidEnd() 进行调用?此外,这种行为是否从 iOS 6.x 更改为 iOS 7.x?

谢谢

【问题讨论】:

TextFieldOnEditDidEnd 是你创建的,对吧? OnEditDidEnd 是用户离开文本字段时触发的事件。我只是重命名了它。 你肯定在 iOS 6 中创建了一个无限循环,如果这在 iOS 7 中没有发生,那么是的,他们以某种方式改变了底层架构。 【参考方案1】:

适用于 iOS 6 和 iOS 7 的解决方案是使用延迟性能。在你的TextFieldOnEditingDidEnd,不要直接调用becomeFirstResponder;相反,在 dispatch_after 函数调用中调用它,并有一点延迟。这将允许第一种方法在第二种方法开始之前结束,从而打破无限循环。

【讨论】:

【参考方案2】:

不完全回答您的问题,但另一种解决方案是:

textFields 上设置tag。开始形式 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;

【讨论】:

以上是关于iOS 6.1 中的 *** 从 TextFieldOnEditingDidEnd 内部调用成为第一响应者时的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight 6.1 - iOS 7 状态栏覆盖 HTML 中的元素

Worklight 6.1 - 有时应用程序卡在 IOS 中的启动画面

xcode 6.1中的崩溃日志符号化IOS 8.1.2?

意外的类型名称“BOOL”:iOS SDK 6.1(设备)中的预期表达式

IBM Worklight 6.1 - 升级到 v6.1 后,iOS 5 中的适配器调用失败

ios 6.1 注释视图,如标准地图