2009-06-03 11 views
5

Mam opartą na dokumentach aplikację Core Data. Istnieje NSTreeController, który zarządza zbiorem obiektów wyświetlanych w jednym NSOutlineView jako liście źródłowej. Są to typowe rzeczy: nagłówki, foldery, foldery inteligentne itp.Architektura kontrolera NS (Array | Tree) dla wielu kontrolerów NSView

Każdy z tych obiektów kontenerowych ma kolekcję obiektów o rozmiarach contents. Mam trzy osobne kontrolery widoku, które wyświetlają te obiekty na różne sposoby (NSTableView i dwa niestandardowe widoki graficzne, jeśli naprawdę chcesz wiedzieć), ale są to tak naprawdę tylko trzy różne prezentacje tych samych danych. Powinny zawsze pokazywać te same obiekty, udostępniać tę samą selekcję itp.

Używam również hierarchii NSViewController s do zarządzania moimi widokami. (Gdybym wiedział o doskonałejCathy Shive, użyłbym tego, ale moje kontrolery widoku są bardzo podobne do - i bardzo zainspirowane - jej)

W obecnej postaci, I mieć NSTreeController żyjących w kontrolerze widoku dla widoku listy źródłowej. Mam również NSArrayController w każdym z kontrolerów sub-view, który jest związany z NSTreeController przez niektóre zbyt skomplikowane klawisze.

Więc, co trzeba zmienić, moim zdaniem, jest następujący:

  • The NSTreeController musi wyprowadzić się z kontrolerem w widoku konspektu.
  • Powinien istnieć pojedynczy NSArrayController, w którym każdy widok zawartości może być powiązany zamiast trzech oddzielnych widoków. Chociaż jestem mniej pewny tego punktu.

To, z czym mam problem, polega na tym, że te rzeczy powinny żyć pod warunkiem, gdzie. Trudno mi jest zdecydować, które obiekty, jeśli w ogóle, naprawdę "posiadają" różnych kontrolerów. Czy kontrolery widoku nadrzędnego są jego właścicielami? Czy sterownik okienny? Jako że są to dane na poziomie aplikacji, czy mogę posunąć się tak daleko, aby uczynić je własnością Delegata aplikacji? (Mogę wyobrazić sobie sytuację, w której użycie może chcieć otworzyć wiele okien, choć obecnie nie jest to obsługiwane) Co myśli umysł ula StackOverflow?

Odpowiedz

2

NSArrayController i NSTreeController traktowane są bardziej jako widok obiektów niż prawdziwych kontrolerów, więc wygląda na to, że jesteś na dobrej drodze. Ja bym zaczął o ten sam sposób ty, dając każdemu NSViewController własnej NSArrayController lub NSTreeController, ile potrzeba, i konfigurowania powiązań między nimi w czasie wykonywania przez kontrolera okiennej, która jest odpowiedzialna za umieszczenie wszystkich elementów razem.

Jeśli uważasz, że to uprościć, to nie brzmi jak nie byłoby nic złego w ruchome obiekty NSArrayController i NSTreeController do sterownika okna. Nadal można ustawić powiązania z obiektem reprezentowanym kontrolerem widoku w IB, a następnie utworzyć kontrolery tablica/drzewo w kodzie w kontrolerze okien w odpowiednim czasie. Po prostu bądź ostrożny, aby nie być zbyt skomplikowanym. Odkryłem, że gdy masz wiele kontrolerów widoku w tym samym oknie, używając obiektu RepresentObject dla różnych rzeczy, łatwiej jest utworzyć oddzielne, wpisane właściwości, dzięki czemu możesz zrozumieć, które części idą gdzie.

ja naprawdę nie rozumiem korzyści z podejmowania tablicy/controllers drzewo część app delegata, ale nie wiem dużo o tym, co robisz tam. Może skorzystasz z tworzenia własnego obiektu "kontrolera danych"?

Trudności w podejmowaniu decyzji mogą być trudne, ponieważ czasami nie ma "właściwej" odpowiedzi, ale dopóki będziesz mieć prostotę i zrozumiałość, będziesz w porządku. Nie bój się wybrać planu i przejdź dalej, zawsze możesz później zrestrukturyzować ... Wiem, że były takie chwile, kiedy spędzałem wiele dni na takich zagadnieniach architektury, kiedy mogłem pracować nad czymś bardziej praktycznym!

+0

Dziękuję za przemyślaną odpowiedź! Zawsze uważałem kontrolerów obiektów za bardziej zorientowanych na widok. To jeden z powodów mojego niezdecydowania tutaj :-) Nie myślałem o użyciu obiektu RepresentObject dla kontrolerów; W pewnym sensie zrezygnowałem z programowania programowego. Motywacją tego pytania jest to, że osiągnąłem punkt, w którym muszę zrestrukturyzować. Staje się zbyt bolesne, aby zarządzać całą złożonością posiadania kontrolerów w dziwnych miejscach. Wykluczyłem również delegata aplikacji jako odpowiednie miejsce. Okno wydaje się najbardziej logicznym miejscem. – Alex

Powiązane problemy