ViewController上的更改不会从iPhone 4S上的didSelectRowAtIndexPath持久化到cellForRowAtIndexPath

时间:2016-04-28 17:53:23

标签: ios iphone swift uitableview swift2

代码说明

我对我的应用程序做了一个小改动(Swift 2.1,xCode 7.2,部署目标8),添加了一个包含两个搜索选项的表。行为可以映射为:

  • didSelectRowAtIndexPath上,更改 ViewController selectedSearchOption属性,然后根据所选元素更改keyboardType。然后,调用reloadInputViews(vc)和reloadData(表格)。

代码

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.selectedSearchOption = self.searchOptions[indexPath.item]
    switch selectedSearchOption {
    case SearchOption.ByTeam:
        searchField.keyboardType = UIKeyboardType.NumbersAndPunctuation
    default:
        searchField.keyboardType = UIKeyboardType.Default
    }
    searchField.reloadInputViews()
    searchOptionsTableView.reloadData()
}
  • cellForRowAtIndexPath方法(之后调用,因为我调用reloadData)上,我检查selectedSearchOption属性以自定义所选元素的视图。

代码

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

    let cell = tableView.dequeueReusableCellWithIdentifier(SearchOptionCell.identifier) as! SearchOptionCell

    let searchOption = self.searchOptions[indexPath.item]
    cell.name.text = searchOption.rawValue
    if self.selectedSearchOption == searchOption {
        cell.imageView?.image = UIImage(named: "ic_done_16")
    } else {
        cell.imageView?.image = nil
    }
    return cell
}

问题:

代码在iPad 2(8.3)和iPhone 6(8.4.1)上工作正常,但在iPhone 4S上(它是9.something,我更新到9.3.1),发生了两件奇怪的事情:

  1. reloadInputViews未更改用户的键盘类型(我已尝试拨打resignFirstResponder然后becomeFirstResponder)。

  2. 调用cellForRowAtIndexPath时,selectedSearchOption属性使用旧值,就像从未更改过一样。虽然很疯狂,如果我调试didSelectRowAtIndexPath,VC上的值是正确的。

  3. 我做错了什么想法?

2 个答案:

答案 0 :(得分:0)

我发现了问题。

我有一个UIKeyboardWillShowNotification事件的听众。

NSNotificationCenter.defaultCenter().addObserver(
    self,
    selector: "showKeyboard",
    name:
    UIKeyboardWillShowNotification,
    object: nil
)

在showKeyboard方法中,我重置了selectedSearchOption值。显然,在 iOS 9 上,reloadInputViews方法正在调用UIKeyboardWillShowNotification事件。

要解决此问题,我现在使用我在UIKeyboardWillShowNotificationUIKeyboardWillHideNotification事件中更新的标记检查键盘是否已打开。很高兴UIKeyboardWillHideNotification方法不会调用reloadInputViews。然后,只要键盘打开,我就会重置selectedSearchOption属性。

答案 1 :(得分:0)

你想调用 reloadInputView ,首先我想知道键盘在你调用reloadInputView的方法之前是否成为第一响应者。这非常重要......希望它对你的问题有用..