Подкласс UIPickerView Swift

Я пытаюсь создать подкласс UIPickerView, чтобы использовать средство выбора в нескольких представлениях. Я пытаюсь программно вызвать свой сборщик как inputView из UITextField, но не могу понять, как правильно его инициализировать. Я сомневаюсь, что это правильный подход и как я могу заставить его работать. Я надеюсь, что любой из вас может мне помочь.

UIPickerView подкласс:

import UIKit

 class GroupPicker : UIPickerView, UIPickerViewDelegate, UIPickerViewDataSource{

    var cdm = CoreDataManager()
    var groupObjList : [Group]!

    init() {
       groupObjList = cdm.groupList()
    }

    //MARK: - Delegates and data sources

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

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

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        return groupObjList[row].title
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        println("picked \(groupObjList[row].title)")

    }        
}

Как я пытаюсь вызвать его в контроллере представления:

override func viewDidLoad() {
    super.viewDidLoad()

    groupPicker = GroupViewPicker()  //instead of UIPickerView()
    groupField.inputView = groupPicker
}

person Jab    schedule 19.02.2015    source источник


Ответы (3)


Вы должны переопределить свой метод init

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override init(frame: CGRect) {
    super.init(frame:frame)
    self.delegate = self
    self.dataSource = self
}
person arthankamal    schedule 16.09.2015

Это было легко.

GroupPicker : UIPickerView {

        override init(frame: CGRect){
            super.init(frame: frame)
            self.groupObjList = cdm.groupList()
        } 
}

Назови это:

viewDidLoad() {
    groupField.inputView = GroupPicker(frame: CGRectZero)
}
person Jab    schedule 19.02.2015

Я полагаю, вы захотите представить это модально?

Если это так, вы можете сделать следующее:

override func viewDidLoad() {
    super.viewDidLoad()

    groupPicker = GroupViewPicker()  //instead of UIPickerView()
    //Send the data you want your picker view to handle.
    groupPicker.groupObjList = dataForPickerView
    self.presentViewController(viewControllerToPresent: groupPicker, animated: , completion: nil)
} 

И он должен всплывать и представлять себя модально

Кончик:

Этот var groupObjPicker: [Group]! взорвется, если вы никогда не перейдете в группу к этому массиву (т.е. вы не установите свойство, как показано выше). Безопаснее (в зависимости от того, чего вы пытаетесь достичь) было бы объявить его пустым массивом, таким как var groupObjList = [Group](). Тогда вы знаете, что если ему ничего не передать, он, по крайней мере, просто вернет 0, когда на нем будет вызван .count и т. д.

person Chris    schedule 19.02.2015
comment
Спасибо за ваш ответ. Я вызываю свой сборщик как inputView UILabel. Проблема в том, что я не знаю, как правильно инициализировать подкласс. - person Jab; 19.02.2015
comment
Извините, не UILabel, а UITextField - person Jab; 19.02.2015
comment
Итак, вам не нужно значение вашего PickerViewController в вашем UITextField? - person Chris; 19.02.2015