UITableViewController 中的键盘重叠文本字段

Keyboard overlapping textfields in UITableViewController

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

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

我已经针对该问题编写了简单的应用程序,因此您可以根据需要查看该错误,我该如何修复它?

Link 到简单、新鲜的 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 上纵向键盘仍然重叠,在横向上一切正常)。所以这不是解决方案。

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

tableView.contentSize = CGSizeMake(widthYouWant, heightYouWant);

或通过 tableview 底部内容从 nib 插入 tableview 的框架部分。然后通过调用

将该行滚动到顶部
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

让我知道这是否是您正在寻找的东西

尝试在您 UITableViewController:

中设置此代码
  -(void)viewWillAppear:(BOOL)animated 
  {
     [super viewWillAppear:YES]; 
  }

Note: UITableViewController has new capabilities in iOS 3.0. A table-view controller supports inline editing of table-view rows; if, for example, rows have embedded text fields in editing mode, it scrolls the row being edited above the virtual keyboard

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

TPKeyboardAvoiding - 在 iOS.

中将文本字段移出键盘的插入式通用解决方案

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

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

[[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];

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

处理此类情况的最佳方法是手动控制 UITableView 并将其移至键盘上方。我已经为它创建了 small class,如果键盘 appears/disappears.

,它会增加和减少你的约束的大小(它可能是从 UITableView 到视图底部的约束)