2015-08-20 4 views
0

У меня есть UIPickerView, который я разместил на своей доске объявлений и создал ссылку на сборщик в моем контроллере. В моем контроллере я хотел бы установить делегат программно. Вот то, что я пробовал:Невозможно установить UIPickerView dataSource/делегировать программным путем

class MyViewController: UIViewController { 
    @IBOutlet weak var text1: UITextField! 
    @IBOutlet weak var text2: UITextField! 
    @IBOutlet weak var picker: UIPickerView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let textPickerDelegate = TextPickerdDelegate(text1: text1, text2: text2, picker: picker) 

     text1.delegate = textPickerDelegate 
     text2.delegate = textPickerDelegate 

     picker.delegate = textPickerDelegate 
     picker.dataSource = textPickerDelegate 
     picker.hidden = true 
    } 
} 

Код для делегата выглядит следующим образом:

class TextPickerDelegate: NSObject, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate { 
    static let TEXT_1_DATA: Array<Array<String>> = { 
     let text1Data: Array<Array<String>> = [[], ["a", "b"]] 
     for i in 1...100 { 
      var text1 = text1Data[0] as Array<String> 
      text1.append(String(i)) 
     } 
     return text1Data 
    }() 

    static let TEXT_2_DATA: Array<Array<String>> = { 
     let text2Data: Array<Array<String>> = [[], ["c", "d"]] 
     for i in 1...100 { 
      var text2 = text2Data[0] as Array<String> 
      text2.append(String(i)) 
     } 
     return text2Data 
    }() 

    let text1: UITextField 
    let text2: UITextField 
    let picker: UIPickerView 

    var pickerData: Array<Array<String>> = TextPickerDelegate.TEXT_1_DATA 

    init(text1: UITextField, text2: UITextField, picker: UIPickerView) { 
     self.text1 = text1 
     self.text2 = text2 
     self.picker = picker 
    } 

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
     return pickerData.count 
    } 

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

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

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     // Select the row 
     picker.hidden = true; 
    } 

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool { 
     if (textField == text1) { 
      pickerData = TextPickerDelegate.TEXT_1_DATA 
     } else if (textField == text2) { 
      pickerData = TextPickerDelegate.TEXT_2_DATA 
     } 

     picker.hidden = false 
     return false 
    } 
} 

Как только я пытаюсь сделать вид, содержащим сборщик, я получаю следующее сообщение об ошибке:

2015-08-20 20:19:14.840 MyApp[13642:645025] -[_UIAppearanceCustomizableClassInfo numberOfComponentsInPickerView:]: unrecognized selector sent to instance 0x7fe072d64ba0 

ответ

2

textPickerDelegate локальна для viewDidLoad. Попробуйте переместить объявление на один уровень вверх, например, IBOutlets.

Я думаю, что у вас также есть потенциальная проблема с текстом _ _ DATA, см моего добавленного комментария внутри:

static let TEXT_1_DATA: Array<Array<String>> = { 
     let text1Data: Array<Array<String>> = [[], ["a", "b"]] 
     for i in 1...100 { 
      var text1 = text1Data[0] as Array<String> // <-- this creates a copy, not a reference 
      text1.append(String(i)) // <-- this appends to the copy, leaving the original intact 
     } 
     return text1Data 
    }() 

В быстрой альтернативе вы можете попробовать это:

let text1Data = [(1...100).map { String($0) }, ["a", "b"]] 
+0

Спасибо за наконечник, используя диапазон. Когда я пытаюсь переместить делегата из метода, я получаю сообщение об ошибке, в котором 'MyController не имеет поля text1'. – Max

+0

Справа. Вам нужно сделать что-то вроде этого: 'var textPickerDelegate: TextPickerdDelegate! = nil' и в viewDidLoad 'textPickerDelegate = TextPickerdDelegate (text1: text1, text2: text2, picker: picker) ' – MirekE

+0

Я не вижу, как это может быть проблемой. 'TextPickerDelegate' получает выделение в куче, и я должен иметь возможность передавать ссылки на него. Но почему-то это решило проблему ... – Max

1

Вам нужно добавить делегата к вашему UIViewController как так

class ViewController : UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

Это предполагает, что вы хотите иметь стандартный UIPickerView

+0

Я не однако хотите, чтобы ViewController был делегатом. В моем коде вы можете увидеть, как я пытаюсь установить делегат явно. – Max

+0

Мой плохой. Извините, я не могу с этим поделать. – brimstone

Смежные вопросы