我有一个UITableViewController
,其中包含大约20个静态单元格,其中一些单元格中有UITextField
个,其中一些单元格仅用于选中复选标记。该表大约有1.5个视图值,因此需要滚动才能获得较低的文本字段。
当我在表格底部的文本字段中点击时,键盘会弹出,但随后会出现在单元格/文本字段上。
我的印象是(来自Apple文档和其他地方)UITableViewController
类在键盘以任何方向出现时自动处理视图的滚动并将tableview向上移动以使单元格可见,这不是但是不会发生。
IOS 5.1,iPad Portrait。
答案 0 :(得分:78)
如果您要覆盖viewWillAppear
,请确保拨打
[super viewWillAppear:animated];
如果不这样做,滚动视图将无法正确向上滚动。
<强>夫特强>
super.viewWillAppear(animated)
答案 1 :(得分:4)
我发现这些答案都不正确。过了一会儿,我注意到如果你推动一个控制器它就不会工作......但是如果你以模态方式呈现它......表格将自动滚动到使用过的文本字段。
希望能为任何人节省时间和压力。
答案 2 :(得分:1)
我自己遇到了这个问题。我刚刚将视图控制器从UIViewController转换为UITableViewController,除了添加[super viewWillAppear:animated];
调用之外,您还需要删除这些行:
[self.tableView setDataSource:self];
[self.tableView setDelegate:self];
因为不再需要它们而且setDelegate会干扰键盘滚动行为。
答案 3 :(得分:0)
如果UITableViewController的自动滚动不适用于 单元格中的UITextField或怪异地滚动,请执行以下步骤。 Swift 5 iOS 13.2测试了100%
首先实现 viewWillAppear ,但不要调用 super.viewWillAppear (这将停止自动滚动)
override func viewWillAppear(_ animated: Bool) {
}
然后让我们手动滚动。
override func viewWillAppear(_ animated: Bool) {
//Notification center observers
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)),
name: UIResponder.keyboardDidShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)),
name: UIResponder.keyboardWillHideNotification, object: nil)
}
//keybord show action
@objc func keyboardWillShow(notification: Notification) {
tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: notification.getKeyBoardHeight, right: 0)
}
//keyboard hide action
@objc func keyboardWillHide(notification: Notification) {
tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
extension Notification {
var getKeyBoardHeight: CGFloat {
let userInfo: NSDictionary = self.userInfo! as NSDictionary
let keyboardFrame: NSValue = userInfo.value(forKey: UIResponder.keyboardFrameEndUserInfoKey) as! NSValue
let keyboardRectangle = keyboardFrame.cgRectValue
return keyboardRectangle.height
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
答案 4 :(得分:-1)
如您所见,这个问题有不同的答案。
我的解决方案
确保为 tableView 返回 numberOfRows。
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 12
}
我不知道为什么这个函数对于静态 tableView 是必要的,但是实现它为我解决了这个问题。