2016-03-24 8 views
0

ich swift Protokoll lerne und pattern.But delegieren, muss ich wirklich mit dem folgenden Problem helfen, die mich leer ErgebnisseSwift Delegierte und Protokoll

Bei Viewcontroller 1 zurück:

protocol GetAllDataProtocol{ 
    func didReadInfo(info : [[String:String]]) 
} 
class ViewController1 : { 
    var delegate : GetAllDataProtocol? 
    var info_data : [[String:String]] = [] 

    override func viewDidLoad() { 

     readData() 
    } 

    func readData(){ 
     info_data.append(["ID" :"234FD","ADDRESS":"Maimi","TYPE":"A"]) 
     delegate?.didReadInfo(info_data) 
    } 
} 

Dann bei Viewcontroller 2 :

class SubmissionViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate,GetAllDataProtocol{ 
     var info_data = [[String:String]]() 

     @IBAction func submitTapped(sender: AnyObject) { 
      print("After : \(info_data)") 
     } 

     func didReadInfo(info: [[String : String]]) { 
      dispatch_async(dispatch_get_main_queue(),{ 
       self.info_data = info 
       print("Before : \(self.info_data)") 
      }) 
     } 
} 

Wenn es laufen

After : [] 

Warum lief es nicht "vorher"? und warum ich die Daten nicht bekommen kann.

+0

Wann/wo setzen Sie den Delegaten? 'x.delegate = y'? – Wain

+0

Entschuldigung für die späte Antwort, ich bin ein wenig beschäftigt bei der Arbeit.Aktuell verwende ich uitabbarcontroller.i möchte nur Daten von einem Tab auf einen anderen Tab übertragen. –

Antwort

1

SubmissionViewController sollte auf ViewController1 verweisen. Weisen Sie in der viewDidLoad() Methode viewController.delegate zu self zu.

Der Code:

class SubmissionViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate,GetAllDataProtocol{ 
    var info_data = [[String:String]]() 
    var viewController1:ViewController1? 

    override func viewDidLoad() { 
     //You should here load viewController1 or connect it by outlet in above 
     let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil) 
     viewController1 = storyboard.instantiateViewControllerWithIdentifier("ViewController1") as? ViewController1 
     self.viewController1!.delegate = self 
    } 
    @IBAction func submitTapped(sender: AnyObject) { 
     print("After : \(info_data)") 
    } 

    func didReadInfo(info : [[String:String]]) { 
     dispatch_async(dispatch_get_main_queue(),{ 
      self.info_data = info 
      print("Before : \(self.info_data)") 
     }) 
    } 
} 
+0

Ich werde es versuchen ... Danke für die Hilfe –

1

Sie sind nicht die Referenz der Delegierten Einstellung als Ahmed Lotfy erklärt.

Vielleicht fehlt Ihnen der Punkt, dass ein Protokoll nur eine Art Vorlage oder Verpflichtung ist. Also, wenn Sie ein Protokoll mit Ihrer Funktion definieren

func didReadInfo(info : [[String:String]]) 

Sie sagen: „Hey, jede Klasse, die dem Protokoll XYZ entspricht, sollten diese Methode implementiert haben.“ Und indem Sie eine Delegate-Variable in Ihrer "ViewController1" -Klasse deklarieren, die dem Protokoll "GetAllDataProtocol" entsprechen soll, stellen Sie lediglich sicher, dass Sie die Funktion "didReadInfo" für dieses Objekt aufrufen können. Aber diese Variable ist nirgends gesetzt, deshalb hat Ihr Anruf

keine Wirkung. Die optionale Verkettung von "delegate?" ist nicht erfolgreich und die Funktion "didReadInfo" wird nie aufgerufen.