Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

Obiekt typu UIWindow i kontroler widoku


  • Zaloguj się, aby dodać odpowiedź
7 odpowiedzi w tym temacie

#1 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 11 czerwca 2014 - 12:13

Mam główne okno aplikacji i tam są dodane kontrolki, teraz jest tam też przycisk, który wywołuje metodę:

-(IBAction)compare:(id)sender
{
    CompareViewController *compareView = [[CompareViewController alloc] initWithNibName:@"CompareViewController" bundle:nil];

/* GDZIE DODAC TEN KONTROLER aby zmienić główny widok ? */
    
}

Czy obiekt window może dodać ten widok, czy muszę utworzyć jakis kontroler widoków i dodać go do window ?
metoda presentsetviewcontroller to chyba metoda kontrolera bo w window nie ma czegos takiego.

- - - Połączono posty - - -

Dobra zrobiłem to tak:


-(IBAction)compare:(id)sender
{
    
    NSLog(@"Uruchamiam metode compare !\n");
    CompareViewController *compareView = [[CompareViewController alloc] initWithNibName:@"CompareViewController" bundle:nil];
    [window setRootViewController:compareView];
    [window makeKeyAndVisible];
}


Klikam w przycisk compare i mam nowe okno. Tylko jest problem, na nowym oknie mam sobie przycisk main, aby wejść do głównego okna.
Tak więc z tego co wiem powinno wywołać się metodę setRootViewController z argumentem nil w celu załadowania defaultowego okna.
Tylko jak dojść do obiektu window, nie mam referencji do tego obiektu w CompareViewController bo niby skąd ? i nie mogę przez to wywołać powyższej metody na obiekcie window aby załadować defaultowy widok. Referencja do window jest w AppDelegate. I jak to zlinkować ?

#2 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 11 czerwca 2014 - 14:12

LOL zdałem się na swoją intuicję i skorzystałem z FirstRespondera CompareViewControllera, tam była metoda zadeklarowania w AppDelegate ( tam jest dostęp do obiektu window - a oto mi chodziło ), która ustawiała widok na główny i mogłem zrobić połączenie z tą metodę. Innej opcji nie było z uwagi na 2 pliki xib. Zresztą w FirstResponderze jest dostęp do wszystkich naszych IBActionów zadeklarowanych we wszystkich naszych plikach nagłówkowych. I to był klucz do rozwiązania. Gdybym chciał wywołać taką samą metodę ale już w CompareViewController gdzie nie ma dostępu do obiektu window, który zarządza widokami to nie ma to szans aby zmienić widok bez referencji do obiektu window. Jak ktoś wie jak to uzyskać to bym był wdzięczny co prawda problem rozwiązany ale to już bardziej kwestia ciekawości ;)

#3 P_P

P_P
  • 131 postów
  • SkądWarszawa

Napisano 11 czerwca 2014 - 14:56

https://developer.ap.../uid/TP40007457

#4 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 11 czerwca 2014 - 16:02

To co wcześniej pisałem odnośnie dostępu do obiektu z innego pliku xib jest mi teraz potrzebne do pobrania danych. Dane te są w obiekcie którego właścicielem jest AppDelegate ( główny plik xib - Window.xib ) a chce mieć dostęp do tego obiektu z poziomu innego obiektu, który jest dodany do drugiego pliku CompareViewController.xib.

#5 wojtkow

wojtkow


  • 6 767 postów
  • Płeć:
  • SkądPoznań

Napisano 11 czerwca 2014 - 17:42

@macsurf: 1. W aplikacjach nie używa się kontrolek na NSWindow, do tego wymyślono NSView do prezentacji i NSViewControler do obsługi - mam wrażenie, że strasznie kombinujesz. 2. Dostęp do kontrolek obiektu z poziomu innego obiektu to kardynalny błąd, obiekt powinien udostępniać, poprzez property, metody etc. dane, które są już przetworzone, sprawdzone itd. I tylko te dane, które są dalej potrzebne. Ogólnie dane powinny być hermetyzowane. 3. Poczytaj co podrzucił Ci @P_P a wcześniej @tmkszlc, bo wyważasz otwarte drzwi i komplikujesz sobie życie (vide Twoje boje z UITableCellView).

#6 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 11 czerwca 2014 - 20:59

Nie bardzo się rozumiemy, oczywiście jest metoda która zwraca przetworzone dane :) tylko żeby je pobrać to trzeba mieć referencje do owego obiektu. Mam przykładowo 2 obiekty, jeden utworzony jest z klasy AppDelegate ( tam jest metoda, ktora zwraca przetworzone dane ) i drugi obiekt utworzony na podstawie rozszerzonej klasy po UIViewController. Tych dwóch obiektów nie mogę ot tak sobie połączyć gdyż pierwszy obiekt jest tworzony podczas inicjalizacji aplikacji ( delegat UIApplication ) a drugi obiekt tworzony jest po akcji ( nacisniecie przycisku ) tworzony jest nowy kontroler widoku w którym chce mieć dostęp do pierwszego obiektu aby puścic mu wiadomość np. "pobierz_dane" :P No oczywiście można zapisać dane do pliku i później je odczytać tylko po co aż tak komplikować sprawę. Hmm no jeszcze mam jedną metodę w głowie do przetestowania - niby taką oczywistą ale to już jutro, dzisiaj już odpadam z rozgrywki ;) Dam jutro znać jak wyszło ;)

#7 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 12 czerwca 2014 - 11:57

Dobra problem rozwiązany ta metoda którą miałem w głowie wczoraj wszystko działa jak należy i jak to zwykle bywa oczywistość i prostota wygrała z komplikacją problemu ;) No ale krótki odpoczynek i sen załatwił sprawę ;) po przebudzeniu problem rozwiązany w kilka sekund ehh

#8 P_P

P_P
  • 131 postów
  • SkądWarszawa

Napisano 13 czerwca 2014 - 08:44

Fajnie




Użytkownicy przeglądający ten temat: 2

0 użytkowników, 2 gości, 0 anonimowych