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