Czy można w jakiś sposób przechowywać wystąpienie UIView w taki sposób, aby można było uzyskać do niego dostęp z innych kontrolerów widoku? Wiem, że to prawdopodobnie graniczy z „globalami”, o których mówią, że są złe, ale robię dygresję. Wiem tylko, że mam kilka kart UITabBar, które muszą odwoływać się do tego samego wystąpienia widoku, który został utworzony na jednej karcie i musi zostać ponownie wyświetlony na innej karcie. Jakie jest najlepsze podejście do robienia czegoś takiego?

0
purefusion 12 sierpień 2011, 17:25
Tylko wskazówka dotycząca nazewnictwa pytań, spróbuj skrócić je, np. „Pokazuje tę samą instancję UIView w różnych UIViewControllers”
 – 
Cyprian
12 sierpień 2011, 17:30
Jestem w tym zły! W każdym razie zaktualizowałem go zgodnie z twoją sugestią! :) (Wcześniej „Przechowuj instancję UIView, aby można ją było wywoływać w razie potrzeby z innych kontrolerów widoku po tym, jak została już ukryta przez inne widoki”)
 – 
purefusion
12 sierpień 2011, 18:06

3 odpowiedzi

Najlepsza odpowiedź

Pewny. Wystarczy przechowywać zachowane odwołanie do obiektu UIView w obiekcie trwałym. Na przykład możesz dodać zachowaną właściwość do swojej podklasy UIApplicationDelegate. Możesz mieć tego delegata, aby utworzył wystąpienie widoku, a wszystkie kontrolery po prostu poproszą delegata aplikacji o widok. Jeśli masz kontroler widoku głównego, który jest zawsze dostępny, możesz go tam zachować.

Być może przemyślenie ogólnej struktury aplikacji pomoże znaleźć „właściwe” miejsce do przechowywania UIView. Poniżej przedstawiam strukturę aplikacji, z której często korzystam, niekoniecznie jako poradę, jak powinieneś ustrukturyzować swoją aplikację, ale jako przykład rozszerzający opcje, które możesz rozważyć, aby pomóc Ci w zastanowieniu się nad najlepszą strukturą dla Twojej aplikacji.

Piszę wiele broszur, takich jak aplikacje dla naszych klientów. W tych aplikacjach muszę przedstawić kilka widoków, każdy w pewnym sensie analogiczny do stron w broszurze. Niektóre z tych widoków będą miały interakcję z użytkownikiem i będą musiały zachować swój stan poza ekranem lub udostępniać dane stanu innym widokom.

Aby zarządzać tymi aplikacjami, tworzę obiekt menedżera prezentacji. Ten obiekt zachowa ogólny stan aplikacji, w tym widoki, które muszą pozostać, gdy nie są wyświetlane. Używam jednego głównego UIViewController, który jest właścicielem menedżera prezentacji i jest odpowiedzialny za wszystkie typowe operacje kontroli widoku. Konkretna logika dla poszczególnych widoków zostanie umieszczona w podklasach UIView dla każdego widoku. Te indywidualne widoki są tworzone przez menedżera prezentacji i mogą poprosić tego menedżera o to, co wie, w tym o wszelkie stałe widoki.

1
Mr. Berna 12 sierpień 2011, 18:16
Tak, wygląda na to, że moja aplikacja jest bardzo podobna do twojej pod względem tego, co musi zrobić... zachować stan widoku, gdy jest poza ekranem.
 – 
purefusion
12 sierpień 2011, 18:20

Możesz po prostu użyć iniekcji zależności, aby wstrzyknąć tę samą instancję widoku do kontrolerów widoku w następujący sposób:

UIView *myView = [UIView new];
UIViewController *controller1 = [UIViewController new];
UIViewController *controller2 = [UIViewController new];
controller1.view = myView;
controller2.view = myView;
[myView release];
1
Oscar Gomez 12 sierpień 2011, 18:18
Interesujący. Nie myślałem o zrobieniu tego w ten sposób, ale jestem prawie pewien, że to nie zadziała z widokami UITabBar, ponieważ UITabBarController utworzy wystąpienie widoku każdej karty niezależnie od instancji, którą utworzyłbym za pomocą powyższego kodu. Jakieś pomysły, jak obejść ten problem?
 – 
purefusion
12 sierpień 2011, 18:58

Jeśli używasz UITabBar, sugerowałbym dodanie własnego widoku do okna w delegatze aplikacji. Wtedy nie musisz go przechowywać, po prostu go ukryj. Możesz użyć NSNotificationCenter do wysyłania powiadomień w celu wyświetlenia widoku lub możesz wywołać aplikację appDelegate i wyświetlić widok ręcznie.

0
Cyprian 12 sierpień 2011, 17:28