UIView an Controller weitergeben

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

  • UIView an Controller weitergeben

    Liebe Community,

    ich stehe im Moment anscheinend auf der Leitung. Ich habe zwei UIViewController. Im ersten habe ich einen CustomView, den ich ebenfalls im zweiten UIViewController anzeigen möchten. Den zweiten UIViewController präsentiere ich als ModalViewController.

    ich hätte gerne, dass ich die Änderungen, die ich am CustomView im 2. UIViewController vornehme, auch im 1. UIViewController erscheinen.

    Beide CustomView Properties sind IBOutlets. Das Problem beginnt schon damit, dass der CustomView im 2. UIViewController gar nicht angezeigt wird, wenn ich das IBOutlet auf den übergebenen CustomView setze.

    Weiß jemand Rat?

    Mit freundlichen Grüßen

    TheFuriousLion
  • TheFuriousLion schrieb:


    Ich habe zwei UIViewController. Im ersten habe ich einen CustomView, den ich ebenfalls im zweiten UIViewController anzeigen möchten.
    ...
    Beide CustomView Properties sind IBOutlets. Das Problem beginnt schon damit, dass der CustomView im 2. UIViewController gar nicht angezeigt wird, wenn ich das IBOutlet auf den übergebenen CustomView setze.


    Schlechte Idee, weil du den ersten dann ja aus der ursprünglichen view hierarchy entfernen müsstest. Das herumreichen von Views widerspricht MVC, wie wäre es den View noch einmal (identisch) zu erzeugen?
  • Man sollte sich mal vor Augen halten warum UITableView nicht UITableViewController heisst.

    Ein UIView kann durchaus eine Datasource und einen Delegate haben um alle Informationen zu beziehen die zur Darstellung nötig sind.
    Ein UIViewController dient viel mehr der Koordinierung und Interaktion zwischen eben solchen Komponenten.

    Es ist nicht gegen MVC sich zum Beispiel einen BarChartView zu implementieren der dann mehrfach (als mehrere Instanzen) in eine View Hierarchie eingefügt wird
    um dieselben Daten anders anzuzeigen.

    Es macht dort sogar Sinn, den UIViewController als Delegate und Datasource zu verwenden, da dieser eben die Interaktion und Darstellungsoptionen steuern soll.

    Das ist auch der Grund dass bei Delegate und Datasource meist das fragende Objekt das erste Argument ist.
    So kann ein UIViewController eben für mehrere Instanzen verantwortlich sein.

    Ausserdem müssen Daten nicht immer in Objekte gekapselt werden.
    Siehe KVC, es geht nur um die Accessor-Methoden.

    EDIT: Fettdruck
  • pmau schrieb:


    Es macht dort sogar Sinn, den UIViewController als Delegate und Datasource zu verwenden, da dieser eben die Interaktion und Darstellungsoptionen steuern soll.


    Ich würde es vermeiden, wenn es geht, das führt im Allgemeinen zu View Controller Bloat.

    pmau schrieb:

    Das ist auch der Grund dass bei Delegate und Datasource meist das fragende Objekt das erste Argument ist.


    Nö, der erste Parameter ist sozusagen das “self” des Delegates, sonst ist das Protokoll relativ nutzlos.

    pmau schrieb:

    So kann ein UIViewController eben für mehrere Instanzen verantwortlich sein.


    Das ist eine Folge des Protokolls, allerdings nicht der Grund. Wenn du aber Konstrukte wie if (tableView == self.tableView1) ... im Code hast, sollte dir auffallen das hier etwas ziemlich schief gelaufen ist.

    pmau schrieb:

    Ausserdem müssen Daten nicht immer in Objekte gekapselt werden.


    Sondern?
  • Ich habe das nun so gelöst, dass ich den CustomView vom Superview entferne und an den zweiten UIViewController übergebe. Funktioniert super, nur muss man erst einmal auf die Idee kommen, dass man den View vom Superview entfernen muss. Das verstehe ich nämlich immer noch nicht.

    In Wirklichkeit übergebe ich ja nur einen Pointer zur Speicheradresse des View-Objekts, oder? Deshalb dachte ich, dass es sich hierbei um das selbe Objekt handelt und sich Änderungen deshalb auch auswirken.
  • TheFuriousLion schrieb:

    In Wirklichkeit übergebe ich ja nur einen Pointer zur Speicheradresse des View-Objekts, oder?

    In Wirklichkeit müsstest Du eine Fehlermeldung übersehen haben, dass das View bereits einen Parent besitzt und entsprechend nicht einfach woanders hingeschoben werden kann.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • TheFuriousLion schrieb:

    Ich habe das nun so gelöst, dass ich den CustomView vom Superview entferne und an den zweiten UIViewController übergebe.

    Auch wenn es schon gesagt wurde und es funktioniert. Es bleibt Murks.

    TheFuriousLion schrieb:

    Funktioniert super, nur muss man erst einmal auf die Idee kommen, dass man den View vom Superview entfernen muss. Das verstehe ich nämlich immer noch nicht.

    Ein View kann immer nur in einer Viewhierachie zur Zeit stecken. So ein View hat ja diverse Eigenschaften, die seine Position, Größe und das Verhalten bei Änderung der Größe (Rotation) beeinflussen. Diese Eigenschaften gibt es nur einmal pro View. Wie willst du also einen View in verschiedenen Viewhierachien positionieren? Vom Zeichnen des Views will ich gar nicht erst anfangen.