2012-04-12 10 views
9

Po zabawach z aplikacjami na iOS, pomyślałem, że dam aplikacji Cocoa wir, zakładając, że rzeczy będą bardzo podobne. Tak więc mam jedną aplikację okienkową z podzielonym widokiem i trochę NSTableView s (myślę, że iTunes) i szukam miejsca do umieszczenia mojego kodu, który pobierze dane z sieci, aby wypełnić tabele.(Kakao) Jaki jest odpowiednik podklasy UIViewController w aplikacji kakao z jednym oknem?

W iOS umieściłbym to w metodzie viewDidLoad odpowiedniej podklasy UIViewController. UITableViewDataSource uzyskałby wtedy dostęp do tych danych w celu zapełnienia ich komórek.

Teraz mam NSWindow, dla którego mógłbym zrobić coś podobnego, ale jak zrobić dla niego NSWindowController? Czy tego właśnie chcę? Mogę umieścić go w AppDelegate, ale nie wydaje się właściwe.

Odpowiedz

12

Różnica między iOS i OS X jest to, że istnieje tylko jedno okno w iOS, ale nie może być wielokrotnością w OS X. NSViewControllers w OS X działają inaczej niż UIViewControllers że NSViewController przeznaczony jest do załadunku i obsługiwać pojedynczy widok, podczas gdy UIViewControllers (przepraszania za mój względny brak wiedzy iOS) wydaje się obsługiwać wiele widoków i zapewnia znacznie więcej kleju między widokami.

Nawet Apple docs napisać, że:

W systemie Mac OS X, zestaw klas AppKit widok kontrolery są asystenci do kontrolera okno , który jest ostatecznie odpowiedzialny za wszystko, co dzieje w oknie.

Stąd, odpowiednik dla UIViewController w OS X nie jest NSViewController, ale raczej NSWindowController, który nie przewiduje OS X znacznie od tego, co robi dla iOS UIViewController poprzez zarządzanie całość indywidualnego okna i układ/treść/interakcja widoków w ramach.

W twoim przypadku użyłbym NSWindowController - ale jeśli aplikacja jest bardzo prosta, działa również App Delegate; a jeśli aplikacja jest bardzo skomplikowana, użycie NSViewController do podziału kodu nie byłoby złym pomysłem.

Najlepszym sposobem na użycie NSWindowController byłoby programowo załadować go w App Delegata przy użyciu [[CustomWindowController alloc] init] i

@implementation CustomWindowController 
- (id)init 
{ 
    self=[super initWithWindowNibName:@"CustomWindowNibName"]; 
    if(self) 
    { 
     //perform any initializations 
    } 
    return self; 
} 
@end 

lub dzwoniąc

[[CustomWindowController alloc] initWithWindowNibName:@"CustomWindowNibName"]; 

bezpośrednio (i przesłanianie initWithWindowNibName), jeśli chcesz to może być wielokrotnego użytku.

I możesz usunąć domyślne okno w MainMenu.xib.


Zasadniczo, znacznie częściej niż NSWindowController zarządza oknem utworzonym w jego pliku. NSWindowController zwykle jest właścicielem tego pliku nib. (Chociaż możliwe jest zarządzanie nim przez okno utworzone programowo, to zwykle nie jest tak, jak to się robi.)

Aby móc korzystać z niestandardowego NSWindowController, konieczne jest zatem skonfigurowanie okna do zarządzania w oddzielnym pliku nib/xib.(użycie domyślnego pliku Xib oznacza, że ​​pozwalasz kakao automatycznie tworzyć instancję NSWindowController bez możliwości podklasy, nie możesz użyć niestandardowego NSWindowController z domyślnym plikiem NSMainNibFile. Aby uzyskać prostą aplikację, po prostu umieść cały kod kontrolera w aplikacji NSApplication/App Delegate)

w Xcode 4 przynajmniej proces polega na tworzeniu XIb z szablonu okna i klasy zwyczaj NSWindowController, instancji klasy CustomWindowController podstawie tej stalówki w -init lub gdziekolwiek, a następnie wywołanie [CustomWindowController showWindow:self]; (lub jeśli to nie praca, -makeKeyAndOrderFront:), aby okno faktycznie się wyświetlało (w - (void)applicationDid/WillFinishLaunching:(NSNotification *)aNotification może być miłym miejscem).

Aby zatrzymać domyślne okno, po prostu go skasuję. Prawdopodobnie jest lepszy sposób, ale tego nie wiem.

+0

Tak, pomyślałem, że muszę użyć kontrolera NSWindow, ale nie byłem pewien, jak podłączyć go do NSWindow. Przeciągnąłem nowe okno do MainMenu.xib i ustawiłem je, ale jest już ładowane, gdy uruchomię aplikację. Próbowałem również używać AppDelegate tylko po to, aby zacząć działać, ale nie wiem jak na przykład. spraw, aby mój wygląd NSTableView wyglądał w AppDelegate.m dla metod prototypowych NSTableViewDataSource. Próbowałem połączyć się ze stołu z "właścicielem pliku" i wybranym źródłem danych, ale błąd kończy się błędem "nieprawidłowe źródło danych widoku NSTable". – TijuanaKez

+0

Najprostszym sposobem na podłączenie NSWindowController jest podzielenie plików nib i nadanie mu własnego pliku do załadowania. Utwórz nowy plik końcówki za pomocą szablonu okna i ustaw właściciela plików na kontroler. Ponadto o próbie połączenia się z źródłem danych: "Właściciel pliku" w tym przypadku była aplikacja NSA; zamiast tego chcesz przeciągnąć do Delegata aplikacji. – Vervious

+0

Ok, więc zrobiłem nowy kontroler "MainWindowController" i zaznaczono "z plikiem XIB". Skopiowałem NSwindow z MainMenu.xip i wkleiłem go do nowego pliku MainWindowController.xib, usuwając stary. "Custom Class" właściciela pliku jest ustawiony na MainWindowController. Dodałem niestandardową metodę init do MainWindowController.m z 'self = [super initWithWindowNibName: @" MainWindowController "];'. Inicjuję moją właściwość MainWindowController w aplikacji delegate 'applicationDidFinishLaunching' z opcją' mainWindow = [[allocWindowController alloc] init]; '.. brak błędów, ale brak okna. Coś, co przegapiłem? – TijuanaKez