UIPickerView не отображается - PullRequest
0 голосов
/ 27 мая 2018

У меня есть DrinkVolumePickerController.swift, где я пытаюсь сохранить логику делегата и источника данных, чтобы они не попадали в мой ViewController

import UIKit

class DrinkVolumePickerController: NSObject, UIPickerViewDelegate, UIPickerViewDataSource {

    var quantities: [(label: String, ml: Int)] = [("Pint", 568), ("Can", 330)]

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

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

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return quantities[row].label + " - " + String(quantities[row].ml)
    }

}

В моем ViewController у меня есть

import UIKit

class AddDrinkViewController: UIViewController {

    lazy var drinkVolumeControl: UIPickerView! = {
        let view = UIPickerView()
        view.translatesAutoresizingMaskIntoConstraints = false

        let controller = DrinkVolumePickerController()
        view.delegate = controller
        view.dataSource = controller

        return view
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(drinkVolumeControl)
        view.setNeedsUpdateConstraints()
    }
}

Когда я запускаю это в симуляторе, я не вижу Picker, но я вижу его в DebugViewHeirarchy.

Если я переместлю всю логику обратно в ViewController и изменим delegate и datasourceна self, тогда он загружается нормально.

Я просто не понимаю, почему не работает, имея их во внешнем файле?

1 Ответ

0 голосов
/ 27 мая 2018

У вас проблема с управлением памятью.

Переместите строку:

let controller = DrinkVolumePickerController()

, чтобы она была свойством AddDrinkViewController вместо локальной переменной внутри drinkVolumeControl.

...