Ios Swift中的UIPickerView子类:viewForRow中的错误可选值

Ios Swift中的UIPickerView子类:viewForRow中的错误可选值,ios,swift,datepicker,uipickerview,Ios,Swift,Datepicker,Uipickerview,我想将UIPickerView子类化,以便创建自定义日期选择器。我试过了,但是斯威夫特说的有一个错误: 在展开可选值时意外发现nil 在这一行:(view.viewWithTag(1)作为UILabel)。text=array[row] 代码如下: class MyPickerView : UIPickerView, UIPickerViewDataSource, UIPickerViewDelegate{ let array = ["one", "two", "three"]

我想将UIPickerView子类化,以便创建自定义日期选择器。我试过了,但是斯威夫特说的有一个错误:

在展开可选值时意外发现nil

在这一行:
(view.viewWithTag(1)作为UILabel)。text=array[row]

代码如下:

class MyPickerView : UIPickerView, UIPickerViewDataSource, UIPickerViewDelegate{

    let array = ["one", "two", "three"]
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override init(frame: CGRect) {
        super.init(frame:frame)
        self.delegate = self
        self.dataSource = self
    }

    //components / row
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return array.count
    }

    //view for row
    func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView {
        if view == nil {
            var view = UIView(frame: CGRectMake(0,0, 150,50))
            let label = UILabel(frame:CGRectMake(0,0, 80, 40))
            label.tag = 1
            view.addSubview(label)
        }
        (view.viewWithTag(1) as UILabel).text = array[row]
        return view
    }
    //did select row
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        println("has selected row \(row)")
    }

谢谢

首先检查view是否为nil,但是在闭包之后,您尝试访问它,无论它是否为nil。如果我没弄错你的意图,你应该替换我

var view = UIView(frame: CGRectMake(0,0, 150,50))


因为现在您正在if语句的范围内创建一个名为view的新变量。

UIPickerView(我想是从ios7开始的)中有一个已知的错误,即视图永远不会被重用。要解决您的问题,请去掉if子句(这样就不需要标记)


出现错误的原因是,有两个不同的对象称为“视图”。您在if子句内创建的视图在该子句外不可见,因此您调用viewWithTag的“视图”是传递给该方法的视图,并且该视图始终为零。

实际上您是对的,如果我创建一个mView=。。。在闭包之前…编辑:但“视图中”参数始终为零。正如RdelMathank rdelmar在文章中所说的,这似乎是一个bug,是的,如果var在闭包之外,它实际上是有效的,但是view in参数实际上总是nil,正如您所说的。请问为什么
返回数组[count]
titleForRow…
中返回编译器错误:
(Range)->I.距离不能转换为Int
?@Paul,语法不正确。您需要array.count。此外,您是否正在实施titleForRow?在实现viewForRow.argh时不应该这样,我犯了一个错误,我想编写array[row]。是的,谢谢你的建议,我试了一个或另一个,很好,非常感谢!
view = UIView(frame: CGRectMake(0,0, 150,50))
func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView {
    var view = UIView(frame: CGRectMake(0,0, 150,50))
    let label = UILabel(frame:CGRectMake(0,0, 80, 40))
    view.addSubview(label)
    label.text = array[row]
    return view
}