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
到视图底部的约束)
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
到视图底部的约束)