【发布时间】:2013-01-17 00:01:55
【问题描述】:
当在 UITableView 中选择了一行并且在导航控制器内触发了推送 segue 时,我想从当前编辑的文本字段中退出第一响应者。这是在弹出框内发生的。
我尝试了两件事:
(1) 我可以看到文本字段在制作动画时正在退出第一响应者,但是当我返回视图控制器时,它再次使用第一响应者并显示键盘。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.view endEditing:YES];
}
(2) 这将阻止在返回视图控制器时恢复编辑,但此方法会破坏动画。在动画结束时,第一个视图控制器变黑并跳了一点。
编辑:刚刚意识到这仅在横向模式下可见,因为它与键盘动画比推送动画更快有关,并且一旦键盘消失并且弹出窗口开始它就会变黑当键盘为其留出空间时,动画到更高的高度。在为导航控制器中的推送动画制作动画时,动画无法处理扩展弹出框。当删除下面的代码并推送并让 iOS 删除键盘时,键盘和推送动画的时间完全相同,从而避免了这个问题。我想知道如何在强迫辞职的同时自己做到这一点。
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.view endEditing:YES];
return indexPath;
}
如何在更改视图控制器时辞职第一响应者,而不会在导航返回时再次恢复文本字段上的第一响应者?
【问题讨论】:
-
您可以使用 shouldBecomeFirstResponder 委托方法来控制某物成为第一响应者。调用 resignFirstResponder (不确定调用的确切措辞)也有效吗?
-
感谢您的回复。我不知道从另一个视图控制器返回时如何识别情况,所以 shouldBecomeFirstResponder 可能会很棘手? resignFirstResponder 给出的结果与 endEditing 完全相同。我在视图控制器上有两个文本字段,这就是我使用 endEditing 覆盖两者的原因。
-
我认为问题可能在于尽管视图正在结束编辑,但实际的文本字段仍被注册为第一响应者。我建议参考第一响应者。 EG UItextField *firstResponder;,并将其与参数一起设置为 textField:DidBecomeActive 调用。因此,您始终可以参考当前的第一响应者。然后,在 viewWillDisappear 中,调用 [firstRespodner resignFirstResponder];。这应该确保没有第一响应者离开。希望能有所帮助。
-
感谢您的提示。您的解决方案与我的#2 解决方案完全相同。因此,唯一的问题是动画故障。我已经编辑了我的问题,以详细说明导致故障的原因。如果您有任何指示必须解决该问题,我会非常高兴:)
-
对不起,我没有意识到这和第二个一样。我在下面发布了一个解决方案,该解决方案应确保在 segue 发生之前隐藏键盘。希望对您有所帮助。
标签: ios objective-c uitableview uinavigationcontroller