使用 UINavigationController 时在 didSelectRowAtIndexPath 中辞职第一响应者

Posted

技术标签:

【中文标题】使用 UINavigationController 时在 didSelectRowAtIndexPath 中辞职第一响应者【英文标题】:Resign first responder in didSelectRowAtIndexPath when using UINavigationController 【发布时间】: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 发生之前隐藏键盘。希望对您有所帮助。 【参考方案1】:

等一下。所以问题是,当您在视图恢复时执行 segue(并关闭视图)时,它会显示一种键盘阴影。是这样吗?在这种情况下。您可以尝试以下方法。当您单击 tableviewcell 时。做个检查。像下面这样。

if(firstResponder != nil)
    //register for keyboard hide notification
    [[NSSnotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:@"UIKeyboardDidHideNotification" object:nil];. 
    [firstResponder resignFirstResponder]; 
 else 
     [self performSegue:@"yoursegueidentifier" withSender:nil];
  

只有在没有响应者(因此没有键盘)的情况下才会启动 segue。如果有键盘,则注册键盘隐藏通知,然后退出响应者。然后,在响应键盘隐藏的方法中

- (void)keyboardDidHide:(NSNotification *)notification 
     [self performSegue:@"yoursegueidentifier" withSender:nil];
    

这应该只在键盘隐藏时执行 segue,所以它应该解决动画问题。您可能需要修改情节提要以从视图控制器而不是从单元格的按钮启动 segue,我不确定您的体系结构如何。让我知道这是否有效。

【讨论】:

以上是关于使用 UINavigationController 时在 didSelectRowAtIndexPath 中辞职第一响应者的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationcontroller 中未使用的视图会发生啥?

使用 push segue 时 UINavigationController 是不是强制

UINavigationController - 使用 UIBlurEffect 清除背景

一起使用 UITabBarController 和 UINavigationController

iPhone - UINavigationController - 使用 CATransaction 自定义动画

如何在 SwiftUI 中使用 UINavigationController