在这种情况下,如何重用 UIPickerView 中的视图?

Posted

技术标签:

【中文标题】在这种情况下,如何重用 UIPickerView 中的视图?【英文标题】:How do I reuse a view inside UIPickerView in this case? 【发布时间】:2019-03-27 14:45:11 【问题描述】:

似乎很多人只是返回一个 UILabel,但就我而言,我正在向视图添加一个标签。观点永远不是零。这是 UIPickerView 的不同用法,因为我将其组件旋转 90 度并让它横向滚动而不是上下滚动。

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView 

    if view == nil 

        let customWidth = 300
        let customHeight = 300

        let view = UIView(frame: CGRect(x:0, y:0, width:customWidth, height:customHeight))

        let label = UILabel(frame:CGRect(x:0, y:0, width:customWidth, height:customHeight))
        if let filter = filters.first(where: $0.pickerViewRowIndex == row) 
            var leading = ""
            if appPurchased == false && filter.requiresPurchase == true  leading = "????" 
            label.text = "\(leading)\(filter.nameStr)"
        
        label.textColor = UIColor.black 
        label.font = UIFont(name:"HelveticaNeue-Bold", size: 18.0)
        label.textAlignment = .center

        view.addSubview(label)

        view.transform = CGAffineTransform(rotationAngle: 90 * (.pi/180))
        label.layer.masksToBounds = false

        return view

    else
        print("not nil") // console never prints this line
    

    guard let reusedView = view else 
        assertionFailure("pickerView label view container never set")
        return view!
    

    return reusedView

【问题讨论】:

【参考方案1】:

视图永远不会不为零。

正确。文档是错误的。实际上没有在选择器视图viewForRow 中重用视图这样的事情。您总是需要创建一个新视图并将其返回。

【讨论】:

真的吗?我注意到,当我滚动它时,我的 CPU 百分比上升了 10-15%,可能是因为它不断地不断地添加该视图。此外,这似乎暂停了我滚动时正在运行的计时器。 我不清楚您的评论在说什么。我只是确认控制台永远不会打印你说它永远不会打印的行,这是一个已知的事实(如果你愿意的话,是错误)。

以上是关于在这种情况下,如何重用 UIPickerView 中的视图?的主要内容,如果未能解决你的问题,请参考以下文章

具有委托方法的可重用 UIPickerView

如何停止 UIPickerView 的可重用性

在这种情况下,如何使用自定义 tableView 单元格处理可重用单元格(从代码中的其他位置更改单元格背景颜色不起作用)

如何在不重复代码的情况下重用具有不同参数的方法

UIPickerVIew viewForRow 中的重用视图:丢失其子视图?

iOS7 UIPickerView / UIScrollView