2016-09-25 33 views
3

我有一个UITableViewController的子类,它显示了几行(确切地说是8行),其中第一行是一个包含UITextField的自定义单元格。加载视图时,我立即通过调用becomeFirstResponder对该textfield键盘弹出。这一切工作正常,直到我从iOS 9升级到iOS 10。现在视图跳转到视图的底部,键盘覆盖了我的最后两行,而我的TextField不在可见区域。当我注释掉becomeFirstResponder呼叫时,跳跃消失,但当然我失去了键盘弹出。这是我的代码看起来像......iOS 10 - UITableViewController在加载时滚动到底部

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. 调用userInfoCell?.nameField.becomeFirstResponder()viewWillAppear()
  2. 调用userInfoCell?.nameField.becomeFirstResponder() in viewDidAppear()
  3. 致电nameField.becomeFirstResponder()UserInfoTableViewCell.awakeFromNib()
  4. 拨打userInfoCell?.nameField.becomeFirstResponder()后致电tableView.scrollToRowAtIndexPath()
  5. 去除super.viewWillAppear()在我的这些viewWillAppear()

都没有为我工作。

+0

试试这个:'让细胞= tableView.dequeueReusa .....'/'回报cell' –

+0

感谢您的建议,但没有不幸的是,这样做。我得到相同的滚动到底部问题。 – Coder1224

+0

嗯,我是否堆栈堆栈溢出? – Coder1224

回答

0

推迟becomeFirstResponder()解决了这个问题对我来说

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

这使得它在屏幕上停留在顶部!但是,现在当屏幕向桌面滑动时,键盘会出现奇怪的闪烁,然后消失,然后又出现另一个键盘。也许是因为它在一个tableview委托中调用,所以被称为多次? 我见过这个'dispatch_async()'作为许多SO帖子的解决方案,但我毫不犹豫地创建线程作为一般规则。那么所有的方法都是这样的 - 创建一个线程来等待主线程准备好了吗? – Coder1224

相关问题