Verständnisfragen zu protocol und segue

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Verständnisfragen zu protocol und segue

    Hallo,

    ich habe da mal 2 Verständnisfragen:

    1. zu protocols: Wenn ich 2 Viewcontroller per protocol/delegate verbinde, dann wird beim Delegierenden eine Variable gesetzt wie z.B. "var delegate: myDelegate". Der Typ ist hier das entsprechende protocol. Dem wird dann der entsprechende Delegate-Viewcontroller zugewiesen. Wie muß ich mir das vorstellen, enthält dann das protocol eine property mit dem Viewcontroller, oder ist das einfach eine Eigenschaft eines protocols?

    2. zu segues: um einen Wert an einen anderen Viewcontroller per segue zu übergeben, nutze ich z.B. prepareForSegue. Aus segue.destination erhalte ich dann den Ziel-Viewcontroller. Mir ist jedoch nicht klar, wieso ich für diesen noch ein casting per as! in den entsprechenden Viewcontroller durchführen muß. Warum erthält der segue, wenn ich ihn z.B. per drag'n'drop mit einem Viewcontroller verbunden habe, nicht direkt die entsprechende Referenz?

    Danke für Hinweise
  • Hallo,

    zu 1.:
    Im Prinzip ist das eigentlich ganz simpel: Du hast zwei ViewController A und B und möchtest, dass B mit A kommunizieren kannst. Damit das funktioniert, hast du in B eine Referenz zu A, dafür bräuchtest du im Prinzip nicht mal Protocols, du könntest auch einfach `var referenceToA: A` definieren. Mit Protocols machst du dich unabhängig von einer spezifischen Klasse (statt A kannst du auch C, D etc. nehmen), du definierst sozusagen lediglich, welche Funktionen oder Attribute vorhanden sein müssen (wie ein Interface). Und wenn A deinem Protokoll MyProtocol entspricht, also es die notwendigen Funktionen und Attribute implementiert, kann es als Delegate verwendet werden. Es ändert sich also nicht daran, dass du in B eine Referenz zu A hast, auch beim Delegation Pattern mit Protocols. Das Protocol selbst ist keine Instanz, stell es dir eher als Blueprint, als Anforderungsschablone vor (dir ist völlig egal welche Klasse das Delegate ist, Hauptsache, es implementiert die Funktionen die du brauchst -> wenn es deinem Protocol entspricht, ist dies der Fall -> das kann vom Compiler überprüft werden).
    Tipp: Nutze `weak`, also `weak var delegate: MyProtocol?`. Damit verhinderst du Strong Reference Cycles.

    zu 2.:
    Er hat bereits die entsprechende Referenz. `segue.destination` gibt dir bereits den passenden `UIViewController` zurück. Allerdings kannst du damit noch nicht deine Custom-Function aufrufen, die du vielleicht in deiner speziellen UIViewController-Subclass implementiert hast, da diese in der Subclass aber nicht in der Parent-Class enthalten ist. Daher castest du den ViewController auf deine eigene Subclass, sodass du dessen Funktionen und Attribute nutzen kannst.
    Tipp: Nutze `as?` anstelle von `as!` um eventuelles Crashing durch Force Casting zu vermeiden. Also z.B.:

    Quellcode

    1. if let vc1 = segue.destination as? MyVC1 {
    2. vc1.myFunc1()
    3. }
    4. if let vc2 = segue.destination as? MyVC2 {
    5. vc2.myFunc2()
    6. }
    Viele Grüße,
    Osxer