У меня есть 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
Спасибо за наконечник, используя диапазон. Когда я пытаюсь переместить делегата из метода, я получаю сообщение об ошибке, в котором 'MyController не имеет поля text1'. – Max
Справа. Вам нужно сделать что-то вроде этого: 'var textPickerDelegate: TextPickerdDelegate! = nil' и в viewDidLoad 'textPickerDelegate = TextPickerdDelegate (text1: text1, text2: text2, picker: picker) ' – MirekE
Я не вижу, как это может быть проблемой. 'TextPickerDelegate' получает выделение в куче, и я должен иметь возможность передавать ссылки на него. Но почему-то это решило проблему ... – Max