首页 > 解决方案 > UIPickerView Swift 5 的语法问题

问题描述

我一直在研究创建 UIPickerView 的各种方法,每次遇到同样的问题时:

我得到错误:

类型“timeselectviewController”不符合协议“UIPickerViewDataSource”

并且 pickerView 函数总是会收到警告:

实例方法 'pickerView(pickerView:titleForRow:forComponent:)' 几乎匹配协议 'UIPickerViewDelegate' 的可选要求 'pickerView(_:titleForRow:forComponent:)'

这是到目前为止的代码:

import UIKit

class timeselectviewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

@IBOutlet weak var gradeTextField: UITextField!
var gradePicker: UIPickerView!

let gradePickerValues = ["5. Klasse", "6. Klasse", "7. Klasse"]

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
    return gradePickerValues.count
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    return gradePickerValues[row]
}

    func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int){
        gradeTextField.text = gradePickerValues[row]
        self.view.endEditing(true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        gradePicker = UIPickerView()

        gradePicker.dataSource = self
        gradePicker.delegate = self

        gradeTextField.inputView = gradePicker
        gradeTextField.text = gradePickerValues[0]
    }
}

标签: swiftuipickerview

解决方案


  1. 关于“不符合协议”的警告,那是因为协议有某些必需的方法。如果您点击警告,它将为您提供添加方法“存根”的机会:

    在此处输入图像描述

    如果您选择“修复”选项,它将添加缺少的必需UIPickerViewDataSource委托方法:

    在此处输入图像描述

    您显然必须为这些方法编写代码,但它会准确地告诉您缺少哪些方法以及您必须做什么。

    注意,是numberOfComponents(in:),不是 numberOfComponentsInPickerView(pickerView:)。你所拥有的似乎是旧的 Swift 2 语法。

  2. 关于“几乎匹配可选要求”警告:

    两者titleForRowdidSelectRow缺少第一个参数的_ 参数标签。它们分别是:

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { ... }
    

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { ... }`
    

    请注意_参数标签,就像您对numberOfRowsInComponent.

    每当您看到这样的警告时,请仔细查看相关协议的文档(UIPickerViewDelegate在这种情况下)。

    通常,如果您点击警告,它甚至会为您提供让 Xcode 为您修复方法签名的选项。选择“...以满足此要求”的选项,而不是“...使此警告静音”的选项:

    满足这个要求

最重要的是,每当您看到有关缺少协议要求和/或“几乎匹配”警告的警告时,请尝试编译器建议的修复和/或仔细检查协议文档。


推荐阅读