【问题标题】:iOS 10 - UITableViewController scrolls to the bottom on loadiOS 10 - UITableViewController 在加载时滚动到底部
【发布时间】:2016-09-25 05:28:16
【问题描述】:

我有一个 UITableViewController 的子类,它显示多行(准确地说是 8 行),其中最上面一行是包含 UITextField 的自定义单元格。加载视图后,我通过在该textfield 上调用becomeFirstResponder 立即弹出键盘。这一切都很好,直到我从 iOS 9 升级到 iOS 10。现在视图跳到视图的底部,键盘覆盖了我的最后两行,我的TextField 不在可见区域内。当我注释掉becomeFirstResponder 调用时,跳跃消失了,但我当然失去了键盘弹出窗口。这就是我的代码的样子...

class UserProfileTableViewController: UITableViewController {

  private var userInfoCell: UserInfoTableViewCell?
  ...

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

  if indexPath.section == 0 {
    userInfoCell = tableView.dequeueReusableCellWithIdentifier("userInfoCell", forIndexPath: indexPath) as? UserInfoTableViewCell

    if !editMode {
      userInfoCell?.nameField.becomeFirstResponder()
    }

    return userInfoCell!
  }
  else if indexPath.section == 1 {
   ....

然后我的自定义表格视图单元格看起来像这样...

class UserInfoTableViewCell: UITableViewCell, UITextFieldDelegate,, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var photoImageView: UIImageView!
...

override func awakeFromNib() {
  super.awakeFromNib()
  // listen for when user touches a textfield
  nameField.delegate = self
  ...
}

override func setSelected(selected: Bool, animated: Bool) {
  super.setSelected(selected, animated: animated)
}

...

我尝试过的事情:

  1. viewWillAppear() 中调用userInfoCell?.nameField.becomeFirstResponder()
  2. viewDidAppear() 中调用userInfoCell?.nameField.becomeFirstResponder()
  3. UserInfoTableViewCell.awakeFromNib() 中调用nameField.becomeFirstResponder()
  4. 在调用userInfoCell?.nameField.becomeFirstResponder() 后调用tableView.scrollToRowAtIndexPath()
  5. 在我的viewWillAppear() 中删除super.viewWillAppear()

这些都不适合我。

【问题讨论】:

  • 试试这个:let Cell = tableView.dequeueReusa..... / return cell
  • 感谢您的建议,但遗憾的是没有这样做。我得到相同的滚动到底部问题。
  • 嗯,我把 Stack Overflow 给绊倒了吗?

标签: ios swift uitableview autoscroll becomefirstresponder


【解决方案1】:

延迟 becomeFirstResponder() 为我解决了这个问题

dispatch_async(dispatch_get_main_queue(), {
    userInfoCell?.nameField.becomeFirstResponder()
})

【讨论】:

  • 这也让我的屏幕保持在顶部!但是,现在当屏幕转到桌子时,键盘出现奇怪的闪烁,然后消失了,然后又出现了另一个键盘。也许是因为它在 tableview 委托中被调用所以被多次调用???我已经在许多 SO 帖子中看到了 dispatch_async() 作为解决方案,但我不愿将创建线程作为一般规则。这就是该方法的全部作用 - 创建一个线程等待主线程准备好了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2016-04-07
  • 1970-01-01
  • 2014-12-12
  • 2013-01-23
  • 1970-01-01
相关资源
最近更新 更多