iPhone: jak przekazywać dane między kilkoma kontrolerami widoku w aplikacji na pasku kart

Mam następujący problem:

Zbudowałem aplikację tabbar z 4 zakładkami. Chcę przekazać obiekt/zmienną z pierwszego kontrolera tab do trzeciego i zainicjalizować ten kontroler odpowiednim obiektem.

Już trochę poszperałem. Najlepszym sposobem, odpowiadającym podejściu czystego modelu, byłoby wywołanie jakiejś metody initWithObject: na wywołanym viewcontrolle. Jak mogę to osiągnąć? Jak mogę wywołać metodę init kontrolera receivercontroller wewnątrz callercontroller? Podasz mi jakiś przykład kodu?

Edytuj: Aby przekazać dane między kilkoma widokami/klasami itp., Wystarczy utworzyć jakąś klasę danych, która przechowuje dane współdzielone między kilkoma klasami. Więcej informacji pod tym linkiem: Singleton

Author: Taryn, 2010-03-02

3 answers

Potrzebny jest obiekt modelu danych, który przechowuje dane dla aplikacji.

Model danych jest niestandardowym, samodzielnym obiektem dostępnym z dowolnego miejsca w aplikacji. Obiekt modelu danych nie wie nic o widokach ani kontrolerach widoków. Przechowuje tylko Dane i logiczne relacje między tymi danymi.

Gdy różne części aplikacji muszą zapisać lub odczytać dane, zapisują i odczytują do modelu danych. W Twoim przypadku view1 zapisuje swoje dane do modelu danych, gdy rozładowuje, a następnie view2 odczyta te dane z modelu danych podczas ładowania (lub odwrotnie.)

W prawidłowo zaprojektowanej aplikacji żadne dwa kontrolery widoku nie powinny mieć dostępu do wewnętrznych danych innego kontrolera. (Jedynym powodem, dla którego Kontrolery widoku muszą wiedzieć o istnieniu innego kontrolera, jest to, że muszą uruchomić Ładowanie tego innego kontrolera.)

Szybkim i brudnym sposobem tworzenia modelu danych jest dodanie atrybutów do delegata aplikacji, a następnie wywołanie aplikacji deleguj z kontrolerów widoku używając:

YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate];
myLocalProperty = appDelegate.someDataModelProperty;

Będzie to działać dla małych projektów, ale ponieważ Twoje dane stają się złożone, powinieneś utworzyć dedykowaną klasę dla Twojego modelu danych.

Edit:

Aby wyjaśnić konkretny przypadek, dodałbyś wywołanie do modelu danych, gdy kontroler ViewController odbiornika stanie się aktywny.

Umieszczenie danych w metodzie init lub viewDidLoad nie zadziała, ponieważ w UITabBar użytkownicy mogą przełączać się tam iz powrotem bez rozładowywania widoku lub ponowne uruchomienie kontrolera widoku.

Najlepsze miejsce do pobierania zmieniających się Danych znajduje się w metodzie kontrolera viewWillAppear. W ten sposób dane będą aktualizowane za każdym razem, gdy użytkownik przełączy się na tę kartę.

 28
Author: TechZen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-29 19:54:21

Możesz rozważyć NSNotificationCenter (Reference ); rejestrujesz kontroler one viewcontroller w centrum powiadomień aplikacji i wysyłasz powiadomienie po dokonaniu wyboru. Po otrzymaniu powiadomienia drugi kontroler ViewController odpowiednio się aktualizuje.

 4
Author: Williham Totland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-02 14:41:10

Myślę, że to nie jest najlepsza praktyka (sprawdź też składnię) jednak mi się upiekło:

W .h

otherclassref *otherclassname

@property (assign) otherclassname otherclassref;

I w .m

@synthesize otherclassref;

Następnie po prostu przypisuję referencję z wygodnego miejsca, np. delegata aplikacji lub gdziekolwiek tworzysz instancję swoich kontrolerów viewcontrollerów.

Wtedy kontroler widoku może uzyskać odniesienie do innego kontrolera widoku.

Dodaję @ class secondviewcontroller do .H pliku dla firstviewcontroller I put umieścić # imports " secondviewcontroller.h " W .m plik pierwszego kontrolera widoku. Są one nazywane odwołaniami do przodu i zapobiegają błędom kompilatora wynikającym z posiadania .pliki h odwołują się do siebie.

 0
Author: PeanutPower,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-02 18:15:19