UIPickerView Swift 5的语法问题

时间:2019-04-19 21:01:00

标签: swift uipickerview

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

我收到错误消息:

  

类型'timeselectviewController'不符合协议   'UIPickerViewDataSource'

和pickerView函数总是得到警告:

  

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

这是到目前为止的代码:

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]
    }
}

1 个答案:

答案 0 :(得分:0)

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

    enter image description here

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

    enter image description here

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

    请注意,它是numberOfComponents(in:),而不是numberOfComponentsInPickerView(pickerView:)。您所看到的似乎是旧的Swift 2语法。

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

    titleForRowdidSelectRow都缺少第一个参数的_ argument label。它们分别是:

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

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

    请注意_参数标签,就像对numberOfRowsInComponent一样。

    每当您看到这样的警告时,请仔细阅读所涉及协议的文档(在这种情况下为UIPickerViewDelegate)。

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

    satisfy this requirement

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