Speicherung von "globalen Variablen" ; Wertübergabe von CollectionView auf Tab-Views. Plist?

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

  • Speicherung von "globalen Variablen" ; Wertübergabe von CollectionView auf Tab-Views. Plist?

    Zunächst einmal ein freundliches Hallo an Alle, die diesen Betrag lesen. Ich bin neu hier im Forum, sowie in der Welt der App-Programmierung und habe direkt mal eine Frage. Es geht hier also um iOS :thumbup:

    Im Rahmen meiner Bachelor-Arbeit entwickle ich eine mobile Rechner-Anwendung für ein Teilgebiet der Ingenieurswissenschaften.
    Dazu habe ich einen Collection-View, in dem zwischen verschiedenen Anwendungen gewählt werden kann, angelegt. Danach wird der Anwender über einen TabBarViewController zum ersten Tab-View geführt. In diesem View können dann Umgebungs- und Randbedingungen eingegeben werden, welche in entsprechenden Variablen gespeichert werden.
    Auf dem zweiten View werden dann diverse Berechnungen durchgeführt.

    Im Grunde genommen komme ich ganz gut klar und habe mein Ziel schon vor Augen. Ein ganz großes Problem habe ich jedoch:

    Ich möchte innerhalb der tab-views noch wissen, welcher Anwendungstyp am Anfang im Collection-View gewählt wurde. Also der wert (selecteditem) , zum Beispiel als NSString, soll über die ganze App abrufbar sein.
    Wie mache ich das am Besten?

    Ich habe schon mit NSNotifications herumprobiert. Konnte hierbei auch werte von einem zum nächsten Tab-View schicken, jedoch ist das nicht so das wonach ich suche.

    Des Weiteren möchte ich, dass die eigebenen Variablen im ersten Tab-View ohne Probleme im zweiten (oder dritten) Tab-view zugegreifbar sind. Und auch wenn man zum Auswahl-Bildschirm zurück wechselt sollen die Werte nicht zurückgesetzt werden, sondern beim nächsten Viewdidload des 1. Tab-Views noch da sein.

    Macht man so etwas mit einem plist-File? Oder gibts da so etwas wie globale Variablen?

    Ich glaube mein Problem ist recht schnell zu lösen, jedoch habe ich schon viel herumgesucht und bisher keine wirklich gute Erkenntnis erlangt.

    Ich hoffe ihr könnt mir helfen. :rolleyes:

    Schon mal vielen Dank
    Gruß Marten
  • Solange es nur ein Wert ist kannst du das mit NSUserDefaults lösen.

    Der schönere Weg wäre natürlich du baust Dir dafür noch eine Controller-Klasse die du dann einfach in jedem ViewController neu instanzierst und die dir dann den Wert liefert. Hier kannst du dann jederzeit die Art der Speicherung ändern ohne das der Rest der Applikation verändert werden muss, wenn Du z.B. doch mal mehr als einen Wert brauchst.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • was ja aber auch nur funktioniert wenn er die info in die UserDefaults speichert und die in der Controller Klasse dann jedes mal ausliest
    wenn er in jedem ViewController deine Controller-Klasse neu instanziiert weiss die ja auch nicht was in der CollectionView getouch wurde
    so kannst du dir dir Controller-Klasse auch einfach sparen und es direkt mit den UserDefaults machen
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • nussratte schrieb:

    was ja aber auch nur funktioniert wenn er die info in die UserDefaults speichert und die in der Controller Klasse dann jedes mal ausliest
    wenn er in jedem ViewController deine Controller-Klasse neu instanziiert weiss die ja auch nicht was in der CollectionView getouch wurde
    so kannst du dir dir Controller-Klasse auch einfach sparen und es direkt mit den UserDefaults machen


    Klar und wenn er dann doch mal meint er will es in eine plist speichern oder in coredata oder oder oder, dann kann er den ganzan code umschreiben.

    Deine Sichtweise ist einfach zu kurzsichtig.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Das sind zwei Teile: 1. Interface zum Zugriff auf Daten und 2. Scope der Daten

    Zu 1: Ein von der Art der Speicherung unabhängiges Interface zum Zugriff auf Daten ist eine gute Idee - so kann man die Implementation beliebig austauschen, ohne den restlichen Code ändern zu müssen. Ich würde das nicht direkt an NSUserDefaults dranflanschen: Abgesehen von der fehlenden Trennung sind die User Defaults schlicht nicht dafür da. Die sind für Benutzereinstellungen. Dass es mittlerweile üblich ist, die für allerhand anderes zu missbrauchen, macht es nicht richtiger.

    Zu 2: Bist Du sicher, dass Du Global Scope brauchst? Ganz sicher? Es gibt nur sehr wenige Situationen, in denen das gerechtfertigt ist. Egal, ob die mit Globals, Singletons, App-Delegate-Properties, User Defaults oder sonstwie umgesetzt werden: Das Problem ist der Global Scope. Der macht Wartung, Wiederverwendbarkeit, Skalierung und Testbarkeit kaputt. Besser ist es, wie Thallius schon schrieb, wenn sich die Controller ihren Kontext weiterreichen. Wenn's schon global sein muss, würde ich das an das App Delegate hängen, weil es für meinen Geschmack am wenigsten ekelig ist.
    Multigrad - 360°-Produktfotografie für den Mac
  • Guten Abend,

    schon einmal vielen Dank für die Antworten.

    Ich möchte mein Problem natürlich so "richtig" wie es geht lösen.

    Vielleicht habe ich mich ein wenig falsch ausgedrückt. Ich hätte gerne, dass ich ein Anzahl von Variablen (z.B. 10) vom Typ NSNumber oder NSString (es geht aber auch als primitiver float) in einem ViewController einlesen und in einem anderen ViewController auslesen und weiterverarbeiten kann. Wenn sich die Werte dann nicht zurücksetzen würden, sobald der Anwender temporär auf einen dritten Controller zugreift, wäre das ganz klasse. Ob wir nun beide vom selbem Begriff "global" reden war mir hier nicht ganz klar :)

    Ich denke so eine Controllerklasse ist das richtige für mich. Leider hab ich aber nicht so die Ahnung wie ich das umsetzen soll. Habt ihr da Tipps für mich? Oder gibts da gute Tutorials?

    Vielen Dank
  • Hallo,

    ich hab mich weiter informiert, komme aber nicht wirklich weiter :(

    Ich habe ein Youtube-Tutorial gefunden, bei dem ich dachte, dass es mir helfen kann.

    [media]http://www.youtube.com/watch?v=XZWT0IV8FrI[/media]

    Da ist es so, dass der Anwender zunächst von einem EingangsView auf einen TexteingabeView wechselt. Dann wird ein Text eingegeben, der per Delegatemethode dem ersten View übergeben und angezeigt wird.
    Ich bekomme aber auf Biegen und Brechen den Transfer zu meinem Projekt nicht hin. Hier habe ich ja einen CollectionView, der über einen TabViewController auf den ersten Viewcontroller gelangt. Die prepareForSegue - Methoden verlaufen also auch ganz anders.

    Es kann auch sein, dass die Vorgehensweise im Video total falsch und unüblich ist.
    Ich hoffe, jemand von euch kann mir nun also einen zielführenderen Tipp geben.

    Thanks
  • Ja.

    Das denke ich mittlerweile auch. (Ich hatte zusätzlich noch einen embedded NavigationController.) Das ist am Ende alles nur verwirrend. Ich werde es überarbeiten.
    Ich schmeiß den CollectionView raus und nutze den TabBarController als InitialController.
    Der Anwender kann dann auf dem ersten TabView die Auswahl vornehmen, die vorher beim CollectionView erfolgte. Da hab ich schon ein paar, auch optisch schönere Ideen.

    Die Wertübergabe des Datensatzes mach ich dann per Singleton. Das hab ich mir zumindest jetzt so gedacht.
    Mal gucken :)
    Wenn noch Tipps vorhanden sind, gerne her damit.

    Grüße
  • Guten Abend,

    Ich bin mittlerweile ein gutes Stück weitergekommen.

    Ich habe nun eine ganz andere Frage, die mit dem Thema dieses Threads nichts zu tun hat. Ich stell sie trotzdem, weil sie ja zu meinem Projekt gehört.

    Ich habe eine große Anzahl von NSString Properties, die durch den Anwender je nach Notwendigkeit beschrieben werden können.

    Nun bin ich in meiner Speichern-Methode und habe den Wert textInput (NSString), der in die jeweilige Property geschrieben werden soll.
    Wie die Property heißt, in die ich den Wert schreiben möchte, weiß ich auch. Das habe ich aus einem NSArray herausgezogen und in die Variable selectedValue (ebenfalls NSString) geschrieben.

    Nun will ich der property den wert zuweisen.
    Im Normalfall könnte man es ja so machen:
    self.propertyName = self.textInput;

    nun brauch man aber den Namen der property.

    Der property Name steht in der Variable selectedValue. Also habe ich zunächst daran gedacht:

    self.self.selectedValue = self.textInput;

    Ich dachte daran, dass mir self.selectedValue den Namen gibt und ich so dann schön variabel die Property beschreiben kann.
    So geht es aber nicht.

    Ich wüsste wie ich es lösen kann, aber das ist wirklich aufwändig:

    if ([self.selectedValue isequaltostring:@"property1"] {
    self.property1 = self.textInput;
    }else if ([self.selectedValue isequaltostring:@"property2"] {
    self.property2 = self.textInput;
    }else if ([self.selectedValue isequaltostring:@"property3"] {
    self.property3 = self.textInput;
    }else if ([self.selectedValue isequaltostring:@"property4"] {
    self.property4 = self.textInput;
    .... usw usw

    Man müsste also bei jeder Speicherung einmal alle Properties durchgehen um zu schauen ob es sich hierbei um die richtige handelt.

    Das muss doch einfacher gehen. Ich hoffe ihr habt eine Idee wie man in meinem Fall durch eine prägnante Eingabe von Code zum Ziel kommt.

    Vielen Dank