2015-06-26 5 views
7

Ich habe zwei ViewController's.Gabe von Daten zwischen zwei Viewcontrollers (delegieren) - Swift

  1. FirstVC - Ich habe label und button mit segue "modalen"

  2. SecondVC - Ich habe PickerView und button (back bis FirstVC):

    @IBAction func bntback(sender: AnyObject) { 
          self.dissmissViewControllerAnimatied(true, completion: nil) 
        } 
    

Und ich erstellt Delegierten in SecondViewController als:

protocol SendDataDelegate { 
    func sendData(text:String) 
} 

Next:

class SecondVC: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 
     var delegate: SendDataDelegate! 
     var firstvc = FirstVC() 
     var arr = ["First", "Second", "Third"] 
     @IBOutlet var pickview: UIPickerView! 
     override func viewDidLoad() { 
     super.viewDidLoad() 
     pickview.dataSource = self 
     pickview.selegate = self 
    } 

Meine Funktion von PickerView und in dieser Funktion, die ich meine Delegierten verwenden, wie:

func pickerView (pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    var text = arr[row] 
    dispatch_async(dispatch_get_main_quene(), { 
    self.delegate.sendData(text)//there is an error: "fatal error: unexpectedly found nil while unwrapping an Optional value" 
)} 
} 

FirstVC:

class FirstVC: UIViewController, SendDataDelegate { 
     var data = SecondVC() 
     //.... 
     override func viewDidLoad() { 
     super.viewDidLoad() 
     self.data.delegate = self 
    } 
    func sendData (text:String) { 
     mylable.text = text 
     //or 
     //var txt = text 
     //mylable.text = txt 
    } 
} 

Helfen Sie mir bitte mit diesem Problem.

+0

'var data = SecondVC()' kann nicht arbeiten, da bereits eine Instanz von SecondVC in Interface Builder erstellt wurde. Die übliche Weise, den Delegierten einzustellen, ist in prepareForSegue – vadian

Antwort

7

1) Sie müssen Delegierte in prepareForSegue setzen:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let viewController = segue.destinationViewController as? SecondVC { 
     viewController.delegate = self 
    } 
} 

UPDATE:

2) Set delegate als Optional

class SecondVC: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 
    var delegate: SendDataDelegate? 
    ... 

    func pickerView (pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     var text = arr[row] 
     dispatch_async(dispatch_get_main_quene(), { 
      self.delegate?.sendData(text) 
     )} 
    } 
+0

Vielen Dank! –

Verwandte Themen