UITableViewController 中的键盘重叠文本字段

Posted

技术标签:

【中文标题】UITableViewController 中的键盘重叠文本字段【英文标题】:Keyboard overlapping textfields in UITableViewController 【发布时间】:2015-04-15 15:10:24 【问题描述】:

UITableViewController 自动管理文本字段编辑:滚动到可编辑内容,更改插图以在屏幕上同时显示文本字段和键盘,而不会出现键盘重叠。这是一个非常酷的功能,因为我不需要编写大量代码来计算新插图、滚动到内容、检查 deviceOrientation 是否更改或键盘是否隐藏等等。

但是当我们使用 SplitViewController 时,该功能失败,在我们添加到 root 之后,控制器自动管理文本字段仅适用于面向 Pad 的屏幕。我认为这是Apple的错误,但也许这是我的错误,我做错了什么?我检查了 SplitViewController -> Navigation Controller -> UITableViewController 层次结构在 Apple 的 HID 中是否正确。

我已经为这个问题编写了一个简单的应用程序,所以如果你愿意,你可以看到那个错误,我该如何修复它?

链接到带有该错误的简单、新鲜的 XCode 项目:https://www.dropbox.com/s/o315awgonzeskeo/TableEditing.zip?dl=0

半解决方案:如果设备是 iPhone,则删除 SplitViewController。在 iPad 上一切正常,但在 iPhone 上却不行,所以我们可以试试:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let rootController = storyboard.instantiateViewControllerWithIdentifier("navigation") as! UINavigationController
    if UIDevice.currentDevice().userInterfaceIdiom != .Pad 
        // setting non-split rootView if device is iPhone
        self.window!.rootViewController = rootController
    

但是有一个问题——我们在 iPhone 6 Plus 上失去了 SplitViewController(我检查过,在 iPhone 6 Plus 上,纵向键盘仍然重叠,横向键盘一切正常)。所以这不是解决方案。

【问题讨论】:

奇怪的行为。在 ios9 中,苹果似乎修复了这个 bug,因此需要对旧版本进行另一种特殊处理。 【参考方案1】:

尝试将此代码设置为UITableViewController

  -(void)viewWillAppear:(BOOL)animated 
  
     [super viewWillAppear:YES]; 
  

注意:UITableViewController 在 iOS 3.0 中有新功能。一种 表视图控制器支持表视图行的内联编辑;如果, 例如,行在编辑模式下嵌入了文本字段,它 在虚拟键盘上方滚动正在编辑的行

【讨论】:

dropbox.com/s/o315awgonzeskeo/TableEditing.zip?dl=0 我的新测试项目,请阅读有关 SplitViewController 的信息(我已经更新了帖子)。【参考方案2】:

只需通过设置内容大小来增加 tableview 高度的大小

tableView.contentSize = CGSizeMake(widthYouWant, heightYouWant);

或通过 nib 的 tableview 框架部分中的 tableview 底部内容插入。然后通过调用将该行滚动到顶部

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

如果这就是你要找的东西,请告诉我

【讨论】:

我不知道tableView的高度,可能有很多不同高度的行。而且我的字段总是在表格的最后,所以我不能只滚动到它,它会留在底部,因为它是表格中的最后一个元素。 我不在我的 Macbook 上,不知道确切的术语。进入你的 Xib 文件。然后选择tableview,然后转到右侧菜单部分的框架部分。然后将底部插入设置为 200(键盘高度) 底部内容插入【参考方案3】:

您可以尝试将 TPKeyboardAvoiding 添加到您的项目中

TPKeyboardAvoiding - 在 iOS 中将文本字段移出键盘的嵌入式通用解决方案。

要与 UITableViewController 类一起使用,请将 TPKeyboardAvoidingTableView.m 和 TPKeyboardAvoidingTableView.h 放入您的项目中,并将您的 UITableView 设置为 xib 中的 TPKeyboardAvoidingTableView。

【讨论】:

我正在寻找原生解决方案,我认为它存在于 UITableViewController iOS8 中的内置解决方案。【参考方案4】:

作为一个选项,您可以订阅键盘通知,例如:

[[NSNotificationCenter defaultCenter] addObserver:self
                                  selector:@selector(keyboardWillShow:)
                                    name:UIKeyboardWillShowNotification
                                  object:self.view.window];

[[NSNotificationCenter defaultCenter] addObserver:self
                                  selector:@selector(keyboardWillHide:)
                                    name:UIKeyboardWillHideNotification
                                  object:self.view.window];

然后当键盘即将显示时,将您的视图向上移动一些像素,以便最后一行可见。当键盘隐藏时 - 将其向下移动。

【讨论】:

【参考方案5】:

处理这种情况的最佳方法是手动控制您的UITableView 并将其移动到键盘上方。我已经为它创建了small class,如果键盘出现/消失,它会增加和减少约束的大小(它可能是从UITableView 到视图底部的约束)。

【讨论】:

以上是关于UITableViewController 中的键盘重叠文本字段的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewController 中的 iAd

UITableViewController 中的 iOS tableHeaderView 从不显示

UITableViewController 中的顶栏背景

框架中的 UITableViewController 未调用 didSelectRowAtIndexPath

从 UITableViewController 中的按钮创建操作

在 UITableViewController 中的 UITableViewCells 之间进行通信