0

У меня есть viewController, у которого есть куча входов на нем. Некоторые из них являются нормальным текстом, но некоторые требуют ввода от сборщика. Я решил переместить реализацию каждого PickerDelegate и PickerDataSource в отдельный файл, чтобы все было немного чище. Данные появляются, но при выборе Picker я не знаю, как запустить событие в моем viewController. В настоящее время он запускается только в классе PickerDelete.Как вернуть выбранное значение в UIPickerDelegate при создании программно

Некоторые основные сведения раскладка

class MyClass: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

let jobTypePickerValues = ["value1", "value2"] 

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

// returns the # of rows in each component.. 
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return jobTypePickerValues.count 
} 

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

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
{ 
    //println("I want this in the view controller that set up the picker") 
} 

На мой взгляд, контроллер, который показывает сборщика У меня есть следующие

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 


    myClassSource = MyClass() 
    pickerView = UIPickerView() 
    pickerView.dataSource = myClassSource 
    pickerView.delegate = myClassSource 

    // set the input view of the job type to be a picker view 
    textInput.inputView = pickerView 
    textInput.text = jobTypePickerValues[0] 
} 
+0

вы можете сделать свой MyClass пользовательского делегат, который может быть вызван в вашем взгляде класса контроллера .. это позволит решить проблему –

ответ

0

Вам нужно создать один пользовательский делегат и реализовать в ViewController, где вы создают pickerView.

protocol CustomPickerDelegate { 
    func selectedItem(item: String) 
} 

Теперь создать экземпляр этого протокола внутри MyClass и реализовать внутри `ViewController``

class MyClass: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

    let jobTypePickerValues = ["value1", "value2"] 
    var delegate: CustomPickerDelegate? 
    .. Other code and methods 

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     delegate?. selectedItem(jobTypePickerValues[row]) 
    } 
} 

Теперь установите делегат в viewDidLoad и реализации метода протокола.

class ViewController: UIViewController, CustomPickerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     myClassSource = MyClass() 
     myClassSource.delegate = self 
     pickerView = UIPickerView() 
     pickerView.dataSource = myClassSource 
     pickerView.delegate = myClassSource 

     // set the input view of the job type to be a picker view 
     textInput.inputView = pickerView 
     textInput.text = jobTypePickerValues[0] 
    } 

     func selectedItem(item: String) { 

      textInput.text = item 
     } 
} 
+0

Спасибо это ответило на мой вопрос, но я думаю, что нужно добавить, что в классе MyClass я должен был добавьте слушателя для события изменения, а затем вызовите метод делегата, который выглядит так: «func pickerView (pickerView: UIPickerView, didSelectRow row: Int, inComponent: Int) { delegate ?. selectedItem («это отправляется в ViewController») } ' – Matt

+0

@Matt Да, я забыл добавить этот код 'delegate ?. selectedItem («это отправляется в ViewController») ' –

+0

Но и другое не возникает. –

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