Как предотвратить дублирование представления - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть расширение, которое создает UIPickerView со следующим кодом

extension FirstVC {
    func createPicker() -> UIPickerView {
        let customPicker = UIPickerView(frame: CGRect(x: 0, y: 0, width: 400, height: 216))
        customPicker.backgroundColor = .white
        return customPicker
    }
}

И у меня есть сохраненное свойство, которое инициализируется через замыкание в моем контроллере представления

private var proxyPeoplePicker: UIPickerView {
   return createPicker()
}

У меня также есть еще 5 представлений выбора, и для предотвращения дублирования я пытаюсь использовать указанное выше сохраненное свойство, но оно не работает, когда я пытаюсь получить информацию внутри, оно всегда возвращает мне свое первоначальное значение. В чем может быть причина этого и как я могу предотвратить дублирование кода с помощью этих представлений средства выбора?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вычисленные свойства действуют как функция. Возможно, было бы полезно убедиться, что результат такого свойства всегда соответствует текущему состоянию его зависимостей.

func createPicker() -> UIPickerView {
    let customPicker = UIPickerView(frame: CGRect(x: 0, y: 0, width: 400, height: 216))
    customPicker.backgroundColor = .white
    return customPicker
}

В вашем случае такое вычисляемое свойство ни от чего не зависит и всегда возвращает новый экземпляр UIPickerView всякий раз, когда вы ссылаетесь proxyPeoplePicker.

Чего вы действительно хотите добиться, так это хранимого свойства, которое инициализируется контроллером представления. Он вычисляется только один раз и остается постоянным до тех пор, пока вы его не перезапишите. Вот что вам нужно сделать, чтобы иметь 5 экземпляров pickerView для работы:

class FirstVC : UIViewController {

    private var pickerView1: UIPickerView?
    private var pickerView2: UIPickerView?
    private var pickerView3: UIPickerView?
    private var pickerView4: UIPickerView?
    private var pickerView5: UIPickerView?

    override func viewDidLoad() {
        pickerView1 = createPicker()
        pickerView2 = createPicker()
        pickerView3 = createPicker()
        pickerView4 = createPicker()
        pickerView5 = createPicker()

        // now you can operate with your picker view

        pickerView1?.backgroundColor = .black
    }
}
0 голосов
/ 12 ноября 2018

Это потому, что каждый раз, когда вы пытаетесь получить proxyPeoplePicker, вы создаете новый экземпляр представления выбора и устанавливаете его как proxyPeoplePicker.Это означает, что вы не получаете никакой информации о предыдущем представлении выбора, потому что вы заменили его.

И да, в этом случае вы должны использовать хранимое свойство, но ваше свойство называется вычисляемым свойством подробнее о свойствах здесь .

Итак, объявите ваши представления выбора где-нибудь в вашемViewController

private var proxyPeoplePicker: UIPickerView?
private var proxyPeoplePicker2: UIPickerView?
...

теперь в viewDidLoad () устанавливает представления выбора

proxyPeoplePicker = createPicker()
proxyPeoplePicker2 = createPicker()
...

Но не забывайте!Если вы хотите получить этот экземпляр proxyPeoplePicker, вам нужно развернуть его

подробнее о развертывании здесь

...