ios - 在 iPhone 4S 上,ViewController 上的更改不会从 didSelectRowAtIndexPath 持续到 cellForRowAtIndexPath

标签 ios iphone swift uitableview swift2

代码说明

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

  • didSelectRowAtIndexPath 上,更改 ViewControllerselectedSearchOption 属性并更改 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 属性以自定义所选 View 的 View 元素。

代码

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 上的值是正确的。

对我做错了什么有什么想法吗?

最佳答案

我发现了问题。

我有一个 UIKeyboardWillShowNotification 事件的监听器。

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

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

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

关于ios - 在 iPhone 4S 上,ViewController 上的更改不会从 didSelectRowAtIndexPath 持续到 cellForRowAtIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36922081/

相关文章:

ios - 如何在 UINavigationBar 标题上设置字距调整(字符间距)-Swift 或 Objective-C

objective-c - 如何让键盘在显示前延迟大约 1/2 秒?

ios - 每天按设定时间间隔触发本地通知。 (例如,每天上午 10 点至下午 6 点,间隔 5 分钟)

iphone - 从 key 链中的 key 对中提取公钥

ios - 检查 Realm 创建函数返回新的或更新的对象

ios - QRCode 扫描仪在 iOS 11 中不起作用,仅显示相机预览

iphone - 如何将 UIActivity Indicator 添加到每个 Cell 并保持对每个单独指示器的控制

ios - 以编程方式为带有 alpha channel 的 spritekit 绘制 Sprite ?

iphone - 为什么CABasicAnimation会将图层的 View 发送到后面和前面?

iphone - 关于iphone中的Paypal支付? (说明如下)