iOS:当 UITextField 获得焦点时,show segue 阻止 UITableViewController 自动滚动
Posted
技术标签:
【中文标题】iOS:当 UITextField 获得焦点时,show segue 阻止 UITableViewController 自动滚动【英文标题】:iOS: show segue prevents UITableViewController to auto scroll when UITextField gets focus 【发布时间】:2015-04-06 15:49:54 【问题描述】:我有一个 UITableViewController,它通过显示(推送)segue 呈现。它的行有 UITextFields。在 iPhone 上,当文本字段获得焦点时,如果该文本字段位于屏幕底部,则键盘会隐藏该文本字段。
这只发生在 iPhone 上,除了“present modalally”或“present as popover”之外的任何segue。对于后一种情况,表格向上滚动文本字段,使其不被键盘覆盖——这是 UITableViewController 的标准行为。
在 iPad 上,它按预期工作(自动滚动表格),无论 segue 类型如何。知道为什么吗?
我创建了一个新项目只是为了测试它,它按预期工作。在它不起作用的初始项目中,UITableViewController 是 SplitViewController 的辅助控制器。
我已经测试过是否使用自动布局,结果相同。
ios8
谢谢
第一个屏幕截图显示了没有文本字段的表格具有焦点 第二个是在最后一个文本字段获得焦点之后拍摄的。它被键盘覆盖。
PS:我已经尝试过只使用 UITableViewController,而不是最初的 UITableViewController 的子类。我知道在子类中存在问题,例如,如果您覆盖 viewWillAppear 但不调用 super。事实并非如此。
相关苹果文档摘录:
注意:表格视图控制器支持表格视图行的内联编辑;例如,如果行在编辑模式下嵌入了文本字段,它会在显示的虚拟键盘上方滚动正在编辑的行。它还支持 NSFetchedResultsController 类来管理从 Core Data 获取请求返回的结果。
UITableViewController 类通过重写 loadView、viewWillAppear: 和其他继承自 UIViewController 的方法来实现上述行为。在你的 UITableViewController 的子类中,你也可以重写这些方法来获得特殊的行为。如果您确实重写了这些方法,请务必调用该方法的超类实现,通常作为第一个方法调用,以获得默认行为。
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/TableViewAndDataModel/TableViewAndDataModel.html#//apple_ref/doc/uid/TP40007451-CH5-SW7
【问题讨论】:
请更清楚地说明问题所在!是否有时键盘会隐藏选定的 TextField 而有时不会?你在这里模拟了 4 个案例,iPhone 与 iPad 以及模态与显示:在什么情况下组合会发生什么? 请截图?你在使用自动布局吗? @UttamSinha - 添加截图,谢谢 @luk2302 - 我已经修改了文本,澄清了您提出的问题。谢谢 @johnnyMac - 似乎不是展示或呈现形式的问题。刚刚检查了我自己的,当最后一行文本字段获得焦点时,tableview 向上滚动。您需要检查 tableview 框架和内容大小。如果您使用的是自动布局,那么您必须检查布局约束。 【参考方案1】:我在 iPhone 6 中检查了该行为并遇到了此类问题。
在 viewDidLoad 方法中 -
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
【讨论】:
谢谢@UttamSinha。这是我要避免的,它应该可以在没有任何这些的情况下工作。 一种简单的方法是在 viewDidLoad 中写入 - self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];这将按预期工作:) @johnnyMac - 那么表格视图是否向上滚动?我在 viewDidLoad 中添加了这个,它可以工作。 不,它不滚动:( 哦,奇怪。我已经检查了键盘通知事件和上面的代码。两者都为我工作。你在使用自动布局吗?如果是,则检查约束。【参考方案2】:我希望我能告诉你为什么下面的代码有效,但我不能;我知道这使得这是一个糟糕的答案。话虽如此,它确实在我的应用程序中始终如一地工作。
为您的视图控制器解除添加一个简单的完成块。在我的代码中,这意味着 viewWillAppear 被调用了两次,一次是在解雇之前,一次是在解雇之后(正如我所说,我不知道为什么这样做,但它对我有用)。
dismissViewControllerAnimated(true) self.viewWillAppear(true)
【讨论】:
以上是关于iOS:当 UITextField 获得焦点时,show segue 阻止 UITableViewController 自动滚动的主要内容,如果未能解决你的问题,请参考以下文章
关于 iOS 辅助功能。如何将焦点转移到pickerView