2010-10-11 16 views
7

Wygląda na to, że powinno być łatwe, ale muszę czegoś pomijać. Mam aplikację opartą na dokumencie. Zbudowałem również nowy XIB, który ma NSTableView i trzy przyciski na nim, które zamierzam wyświetlić listę poprzednich plików. Chciałbym, aby XIB był wyświetlany zamiast okna dokumentu, gdy aplikacja jest uruchamiana po raz pierwszy. Gdy użytkownik wybierze stary plik lub kliknie przycisk "Nowy", chcę przejść do okna dokumentu. Jest to bardzo powszechne i widziałem często używane.Uruchamianie aplikacji opartej na dokumencie Cocoa pokazuje najpierw okno wyboru

W moich próbach uzyskania tej pracy zmodyfikowałem plik project-info.plist i zmieniłem nazwę głównej bazy danych NIB z MyDocument na moją wybraną nazwę XIB. Powoduje to, że aplikacja wyświetla okno wyboru zamiast okna MyDocument. Wydaje się, że nie ma problemu do tej pory.

W moim oknie wyboru ustawiłem widok tabeli oraz kontroler tablic i niestandardowy kontroler okien tylko dla tego XIB. Ustawiłem właściciela pliku na nowy kontroler okna i powiązałem właściwość okna kontrolera okna z oknem i właściwością delegata okna z właścicielem pliku, a także przyciskami "Wybierz", "Anuluj" i "Nowy". Nic nie jest związane z NSApplication. Ale dziwne jest to, kiedy uruchomić tę aplikację Wydaje chcą połączyć te kontrolery do NSApplication z błędem (tak samo dla pozostałych dwóch przycisków):

nie może połączyć się z selectButton działania: do docelowej klasy NSApplication

Wyświetla również komunikat o błędzie, że aplikacja NSApplication nie jest zgodna z kluczem wartości dla gniazda, które zawiera odniesienie do mojej tablicy. Kontroler, okno i przyciski Array nie są powiązane z aplikacją NSA, ale z nowym kontrolerem okien. Spodziewałbym się, że gdyby wystąpił jakikolwiek problem, NIE wspomniałbym o NSApplication, ale raczej o kontrolerze okien, do których kontrolery są związane.

Ktoś wie, co się tutaj dzieje? Czy jest to problem docelowy, ponieważ zmieniłem "Główną nazwę bazy pliku NIB" z "Menu główne" na "Wybór"? Jeśli nie mam tego zmienić, to w jaki sposób mogę pozwolić, aby Cocoa pozwolił mi wyświetlić ekran wyboru przed wyświetleniem okna dokumentu?

Każda pomoc jest bardzo doceniana. Rob

Odpowiedz

9

Ustawienie w IB dla klasy właściciela pliku stalówki ma charakter wyłącznie pomocniczy; pozwala IB pokazać tylko punkty sprzedaży i działania, które są dostarczane przez wystąpienia tej klasy. Nie wymusza to, że Właściciel pliku będzie instancją tej klasy, ponieważ Właściciel pliku nie jest częścią stalówki.

Właściciel pliku jest obiektem, który ładuje stalówkę. To koniecznie oznacza, że ​​znajduje się na zewnątrz stalówki, a nic w stalówce niczego nie określa. W przypadku stalówka Main Menu, jej Właściciel pliku - obiekt, który ładuje stalówkę głównego Menu - jest instancją aplikacji NSApplication. Tak więc wszystko, co podpinałeś się do właściciela pliku w stalówce Main Menu, podpinałeś się do obiektu aplikacji, mimo że powiedziałeś IB, że nie będzie to aplikacja.

To, że aplikacja jest właścicielem końcówki głównego menu - niezależnie od tego, co powiesz IB-nie jest błędem. Aplikacja jest zawsze właścicielem stalówki Main Menu. To normalne i poprawne; nie można go zmienić, nie należy go zmieniać i nie trzeba go zmieniać.

Błąd, w skrócie, polega na tym, że używasz jednej stalówki do dwóch różnych celów.

Powinieneś pozwolić, aby stalówka naczelna była sama - zawiera tylko Menu Główne, Twój niestandardowy kontroler dokumentów (dojdę do tego za chwilę) i delegat Twojej aplikacji - i przeniesie okno poprzednich dokumentów do oddzielnego stalówka, posiadana przez kontroler poprzedniego okna dokumentów. Aby kontroler okien mógł być właścicielem tej stalówki, musisz załadować ją przez kontroler okien. Musisz to zrobić w kodzie - nie możesz ustawić tego w IB lub w plist.

W delegacie aplikacji, stwórz instancję i kontroler okna. Wygląda na to, że utworzyłeś niestandardową podklasę NSWindowController, więc możesz zastąpić jej init, aby wysłać wiadomość o numerze initWithWindowNibName:, aby załadować i posiadać stalówkę. Następnie wystarczy użyć alloc i init, aby utworzyć kontroler okien z delegata aplikacji.

Spowoduje to usunięcie komunikatu konsoli i upewnienie się, że przyciski są rzeczywiście podłączone do kontrolera okna (ponieważ są podpięte do Właściciela pliku, który przy tej zmianie będzie kontrolerem okna) .

Poproś delegata aplikacji, aby odpowiedziała na applicationOpenUntitledFile:, wysyłając kontroler okna wiadomość showWindow:. Spowoduje to wyświetlenie okna poprzednich dokumentów za każdym razem, gdy użytkownik zwykle utworzył nowy dokument.

Aby obsługiwać zwykłe metody tworzenia dokumentów (to znaczy, aby nowy dokument działał), należy wdrożyć applicationDidFinishLaunching: i applicationShouldHandleReopen:hasVisibleWindows:, a nie applicationOpenUntitledFile:. Upewnij się, że żadne dokumenty nie są otwarte i pokaż okno, jeśli tak jest.

Należy również dokonać niestandardowego podklasa NSDocumentController i zrobić kontroler dokument instancją, że w tej klasie, wdrożyć addDocument: i removeDocument: aby ponownie wyświetlić okno poprzednich dokumentach, gdy ostatni otwarty dokument jest zamknięty, a ukryj, gdy dokument jest otwarty.

+0

To bardzo pomogło. Niektóre z tego, co mnie rzuciło, to to, że aplikacje do dokumentów używające danych podstawowych nie tworzą automatycznie delegata aplikacji. Po utworzeniu delegata mogłem zatrzymać automatyczne tworzenie, a następnie otworzyć moje początkowe okno. Wielkie dzięki! – Rob