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
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ę.
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.
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.
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