如果未关闭键盘,则在使用搜索栏时进行 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 之前以编程方式关闭键盘来解决这个问题,但我也担心我可能在 UISearchBar
或 UITableView
上做错了什么。
我的目标项目是 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] [关闭]