如果未关闭键盘,则在使用搜索栏时进行 segueing 会更改目标视图控制器布局

Posted

技术标签:

【中文标题】如果未关闭键盘,则在使用搜索栏时进行 segueing 会更改目标视图控制器布局【英文标题】:If keyboard is not dismissed, segueing when using a search bar changes destination view controller layout 【发布时间】:2012-12-12 10:27:41 【问题描述】:

我有一个UITableView,其中显示了聊天室列表。我还使用搜索栏来查找特定的聊天室。当用户点击一个单元格时,它会进入聊天室对话,显示消息和一个用于发送消息的文本框。

但是,如果我使用搜索栏搜索聊天室,当我点击任何单元格时,segue 已完成,但聊天室的布局是错误的。对话视图(自定义UITableView)会填满整个屏幕,而文本框(位于底部,就在TabBar 的顶部)不会出现。

尝试解决此问题时,我发现如果在点击任何单元格之前关闭键盘,我能够正确搜索,因此似乎只有当键盘存在时才会发生这种情况。

我认为我可以在 segueing 之前以编程方式关闭键盘来解决这个问题,但我也担心我可能在 UISearchBarUITableView 上做错了什么。

我的目标项目是 ios 5.1,我已经在运行 5.1 的 iPad 3、运行 6.01 的 iPad 2 和 iPhone 模拟器中重现了这个问题。

编辑

这是我用来segue的代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    if (self.searchController.searchResultsTableView == tableView) 
        self.selectedItem = [self.filteredItems objectAtIndex:[indexPath row]];
     else 
        self.selectedItem = [self.items objectAtIndex:[indexPath row]];
    
    [self performSegueWithIdentifier:@"segueChatRoom" sender:self];



- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    [self.view endEditing:YES]; // This line solves the issue
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle: @"Custom title" style: UIBarButtonItemStyleBordered target: nil action: nil];
    [[self navigationItem] setBackBarButtonItem: newBackButton];
    if ([segue.identifier isEqualToString:@"segueChatRoom"]) 
        [segue.destinationViewController setItem:self.selectedItem];
    

【问题讨论】:

你能分享一些你的代码,关于你是如何进入下一个视图的吗? @PaulPeelen 我刚刚添加了 segue 代码。 您的代码看起来正确,我似乎对话视图的大小(甚至可能是边距)可能不正确?您能否添加对话视图的屏幕截图,以便我知道我理解正确?在对话视图中,您是否以编程方式添加表格视图并将框架设置为例如320x480? (愚蠢的问题,但值得一问)。 您将 setItem 发送到哪个 viewController?你试过 YourOtherViewController * YVC = (YourOtherViewController* )[segue destinationViewController]; [YVC setItem:self.selectedItem]; 【参考方案1】:

正如您已经指出的那样,您需要辞去第一响应者的职务(放下键盘)。你的 [self.view endEditing:YES];本质上就是这样做的。

【讨论】:

您有任何关于此的链接或参考资料吗?我已经解决了这个问题,但我找不到任何关于为什么需要这样做的解释。 一个测试是在您的 prepareForSegue 方法期间使目标控制器上的 textView 成为FirstResponder。在 segue 结束之前辞职第一响应者并不是一个坏习惯,并且可以实现更好的动画过渡。您是否尝试过我作为评论发布的代码?我很好奇您如何在没有明确这样做的情况下实例化您的目标视图。 " if ([segue.identifier isEqualToString:@"segueChatRoom"]) YourOtherViewController * YVC = (YourOtherViewController* )[segue destinationViewController]; [YVC setItem:self.selectedItem]; "

以上是关于如果未关闭键盘,则在使用搜索栏时进行 segueing 会更改目标视图控制器布局的主要内容,如果未能解决你的问题,请参考以下文章

单击搜索栏时如何显示单独的视图? [SwiftUI] [关闭]

Nativescript Vue:滚动ListView时如何关闭searchBar键盘?

触摸 UISearchbar 时如何修复偏移键盘

屏幕键盘出现时iOS隐藏导航栏

如何解决点击搜索栏时的跳跃问题?

如果显示插页式广告,则在活动中未调用onResume()和onPause()