如何使用UIPicker dataSource

Jho*_*eve 3 swift

我使用Xcode 8和swift 2.3,但是UIPickerView.dataSource = (self as! UIPickerViewDataSource)当我尝试使用func时,我遇到了一个问题UIPicker,这是我的代码:

import UIKit

class ViewController: UIViewController {

    let Num = ["1","2","3","4","5","6"]

    @IBOutlet weak var UIPicker: UIPickerView!
    override func viewDidLoad() {
        super.viewDidLoad()

        func numberOfRows(inComponent component: Int) -> Int {return 1}

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

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

        UIPicker.dataSource = (self as! UIPickerViewDataSource)
        UIPicker.delegate = (self as! UIPickerViewDelegate)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的代码时,Xcode警告代码:

无法将'test.ViewController'类型的值(0x1000bd8c0)转换为'UIPickerViewDataSource'(0x1ab289738).2016-06-29 15:33:35.079300 test [474:98176]无法将'test.ViewController'类型的值(0x1000bd8c0)转换为'UIPickerViewDataSource'(0x1ab289738).

Sha*_* Of 5

添加UIPickerViewDataSourceUIPickerViewDelegate到类声明:

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate
Run Code Online (Sandbox Code Playgroud)

并且不要使用类型转换self:

override func viewDidLoad() {
    super.viewDidLoad()

    UIPicker.dataSource = self
    UIPicker.delegate = self
}
Run Code Online (Sandbox Code Playgroud)

此外,您必须将方法移出viewDidLoad功能,并纠正它们:

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

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

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {return Num[row]}
Run Code Online (Sandbox Code Playgroud)

请注意,我强烈建议您将您的NumUIPicker属性重命名为numpicker,因此您不会将它们与类名混合

更新:完整ViewController代码:

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    let Num = ["1","2","3","4","5","6"]

    @IBOutlet weak var UIPicker: UIPickerView!
    override func viewDidLoad() {
        super.viewDidLoad()

        UIPicker.dataSource = self
        UIPicker.delegate = self
    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {return 1}
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {return Num.count}
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {return Num[row]}
}
Run Code Online (Sandbox Code Playgroud)