首页 > 解决方案 > 当我将 @objc 推理更改为关闭时(在我转换为 Swift 4 的项目上),为什么我的 UIPickerView 项目不会显示?

问题描述

这是我的应用程序在将其转换为 Swift 4.2(来自 3.x)后运行的部分快照。您可以看到我的 UIPickerView 中的项目确实正确显示。

CYaPass UIPickerView

但是,如果我更新项目并将 objc 推断更改为关闭(而不是打开)——XCode 建议更改此设置——那么我的 UIPickerView 不会显示这些项目,尽管它们包含在列表中。

将 objc 推理设置为关闭

UIPickerView 的快照似乎是空的

这是正在运行的应用程序,它显示了一个空的 UIPickerView,但正如您所见,我已选择删除一个项目。但是,在它后面你可以看到 UIPickerView 似乎是空的。

UIPickerView 似乎是空的,但不是

这是在 UIPickerView 中加载项目的基本代码

public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
    if (siteKeyPickerValues != nil){
        return siteKeyPickerValues.count
    }
    return 0
}

public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{
    if (siteKeyPickerValues != nil && siteKeyPickerValues.count > 0){
        return siteKeyPickerValues[row]
    }
    return nil
}

siteKeyPickerValues(字符串数组)已初始化

siteKeyPickerValues 似乎也已正确初始化。这里它在调试模式下运行,@objc inferenece 关闭: siteKeyPickerValues 有值

标签: swiftuipickerviewinference

解决方案


以前(在 Swift 3.x 和以前版本的 XCode 下),我用以下方式设置了 MainControllerView 并且它工作正常:

class MainViewController: UIViewController, UIPickerViewDelegate, UITextFieldDelegate

在@matt 发表评论后,我只是做了一个更改并添加了UIPickerViewDataSource以下内容:

class MainViewController: UIViewController, 
UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate

我使用设置为默认(或关闭)的@objc 推理进行了重建并运行了程序,现在我在 UIPickerView 中看到了预期的项目。

uipickerview 显示项目

这样就解决了问题。我想知道这是最近的变化,还是以前碰巧工作过?


推荐阅读