Создание второго делегата - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь создать второго делегата UIPickerView, чтобы я мог управлять им по отдельности вместо использования блоков if. Ниже приведен пример, который я собрал, я не уверен, как подключить второй выход UIPickerView ко второму делегату UIPickerView (при условии, что это все, что мне не хватает).

import UIKit

protocol secondDelegate {
    func secondPickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    func secondNumberOfComponents(in pickerView: UIPickerView) -> Int
}

protocol secondDelegateDataSource {
    func secondPickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
}

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, secondDelegate, secondDelegateDataSource {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        p1.delegate = self
        p1.dataSource = self
        p2.delegate = self
        p2.dataSource = self
    }

    @IBOutlet weak var p1: UIPickerView!
    @IBOutlet weak var p2: UIPickerView!

    var delegate2: secondDelegate?
    var dataSource2: secondDelegateDataSource?

    let picker1 = ["1","3","5"]
    let picker2 = ["2","4","6"]

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

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

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return picker1[row]
    }

    // second picker
    func secondNumberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

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

    func secondPickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return picker2[row]
    }
}

1 Ответ

1 голос
/ 09 мая 2020

Итак, вот проблема: вы произносите слова «второй делегат», но в факте у вас все еще есть только один делегат - контроллер представления.

Это твоя ошибка. Сделайте так, чтобы ваши дела соответствовали вашим словам. Получите весь код делегата out контроллера представления. Вместо этого предоставьте вашему контроллеру представления два вспомогательных объекта - два делегата средства выбора. Правильно направьте свойства dataSource и delegate двух сборщиков, по одному каждому делегату. Теперь сообщения приходят и уходят в совершенно разные места, и у вас не будет ни единого узкого места с предложениями if повсюду, как сейчас.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...