【问题标题】:UIPickerView subclass in Swift : error optional value in viewForRowSwift 中的 UIPickerView 子类:viewForRow 中的错误可选值
【发布时间】:2015-02-19 16:33:23
【问题描述】:

我想继承 UIPickerView 以创建自定义 DatePicker。我试过这个,但是 Swift 说有一个错误:

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

在这条线上:(view.viewWithTag(1) as 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)")
    }

谢谢

【问题讨论】:

    标签: ios swift datepicker uipickerview


    【解决方案1】:

    UIPickerView 中存在一个已知错误(我认为是从 iOS 7 开始的),即视图永远不会被重用。要解决您的问题,请去掉 if 子句(这样就不需要标签了),

    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
    }
    

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

    【讨论】:

    • 感谢 rdelmar,是的,如果 var 在闭包之外,它实际上可以工作,但参数中的视图实际上总是 nil,如你所说。请问为什么titleForRow...中的return array[count]会返回编译器错误:(Range<!>) -> I.Distance is not convertible to Int
    • @Paul,这不是正确的语法。你想要array.count。另外,您是否正在实施titleForRow?实现 viewForRow 时不应该这样做。
    • 啊,我搞错了,我想写array[row]。是的,感谢您的建议,我正在尝试其中一个,完美,非常感谢!
    【解决方案2】:

    首先您检查视图是否为 nil,但在关闭之后您尝试访问它是否为 nil。如果我正确理解你的意图,你应该替换

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

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

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

    【讨论】:

    • 实际上你是对的,如果我在关闭之前创建一个 mView = ... ,它会起作用....编辑:但参数中的视图总是为零。正如 rdelmar 的帖子中所说,这似乎是一个错误
    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多