Как в этом случае повторно использовать представление внутри UIPickerView? - PullRequest
0 голосов
/ 27 марта 2019

Кажется, что многие люди просто возвращают 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 Ответ

1 голос
/ 27 марта 2019

Вид никогда не ноль.

Правильно.Документы не правы.На самом деле не существует такой вещи, как повторное использование представлений в представлении выбора viewForRow.Вам всегда нужно создать новый вид и вернуть его.

...