2013-02-07 36 views
7

Trong câu trả lời this được cho là có thể có tùy chỉnh NSWindowController bằng cách xóa cửa sổ khỏi MainMenu.xib và khởi chạy trình điều khiển cửa sổ 'thủ công' từ applicationDidFinishLaunching:. Nhưng nó cũng nói:Có thể có NSWindowController tùy chỉnh khi khởi chạy không?

Để ngăn cửa sổ mặc định hiển thị tôi chỉ cần xóa nó. Có lẽ có một cách tốt hơn nhưng tôi không biết điều đó.

có cách nào tốt hơn không? Đó là cách tốt hơn, nó nên tồn tại? Nó được coi là 'bình thường' thực hành để có được bộ điều khiển cửa sổ của riêng bạn?

Trả lời

9

Để làm điều này, bạn thường sẽ phân lớp NSWindowController và thay đổi lớp Chủ sở hữu tệp thành lớp con WindowController của bạn trong ngòi bút.

EDIT:

Nếu bạn không làm một ứng dụng dựa trên tài liệu, và chỉ muốn một NSWindowController của riêng bạn để làm bốc theo yêu cầu của ngòi (hoàn toàn hợp lý), sau đó bạn muốn xóa sổ từ ngòi bút của mình và nhanh chóng một lớp con NSWindowController lập trình, sử dụng nó một cách rõ ràng để làm bốc cửa sổ của bạn ...

@implementation MyApplicationDelegate { 
    MyWindowControllerSubclass *windowController; 
} 


-(void)applicationDidFinishLaunching:(NSNotification *)notification { 
    windowController = [[MyWindowControllerSubclass alloc] initWithWindowNibName:@"MyWindowNib"]; 

    [windowController showWindow:nil]; 
    [windowController.window makeKeyAndOrderFront:nil]; 
} 
+0

Đáng buồn thay, điều này không hiệu quả.Chủ sở hữu ban đầu là NSApplication và bạn nhận được 2 cảnh báo khi bạn thay đổi điều đó. Cửa sổ này xuất hiện, nhưng điều khiển cửa sổ của tôi là 'initWithWindow:' không được gọi, như là 'awakeFromNib' ... – 11684

+0

Xin lỗi, bạn không thay đổi phân lớp trong MainMenu.nib, bạn thay đổi nó trong nib của tài liệu của bạn . Tôi giả sử bạn đang làm một ứng dụng dựa trên tài liệu, tôi không nghĩ rằng bạn thậm chí có được một NSWindowController để thay thế khác, không theo mặc định. Nếu bạn không làm một ứng dụng dựa trên tài liệu, thì điều tốt nhất cần làm thực sự là xóa cửa sổ soạn sẵn bản đồ, tạo một lớp con của NSWindowController trong việc tạo ra ứng dụng của bạn trong applicationDidFinishLaunching: và sử dụng nó để tải cửa sổ của bạn theo cách lập trình từ một cửa sổ riêng biệt nib. – iluvcapra

+0

Không, đây không phải là ứng dụng dựa trên tài liệu. Nhưng sau đó tôi sẽ làm điều đó! Cảm ơn! – 11684

0

tôi thực sự tìm thấy một cách khác: NSWindowController có phương pháp -initWithWindow:. Bởi vì App Đại biểu có một tài sản window được liên kết với cửa sổ từ MainMenu.xib khi khởi động, nó là dễ dàng để liên kết nó với WindowController tôi:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    MyWindowController *wincon = [[MyWindowController alloc] initWithWindow:window]; 
} 

tôi vẫn chưa nghiên cứu này, nhưng tôi không nhận được bất kỳ lỗi.

7

Tôi đã gặp sự cố tương tự và tôi muốn hiển thị cho bạn giải pháp của riêng tôi.

  1. Tạo một ứng dụng bình thường Cocoa (không Document Based)
  2. Đến MainMenu.xib một xóa sổ
  3. Đi trước và tạo ra một tập tin mới, User Interface -> Window
  4. Sau đó, tạo một lớp con của NSWindowController
  5. Mở tệp xib vừa tạo và đặt Lớp tùy chỉnh trong số Identi ty thanh tra đến lớp con vừa tạo của NSWindowController
  6. Nhấp chuột phải vào Chủ đầu tư tập và kết nối cửa sổ tài sản vào cửa sổ thực tế
  7. Bây giờ đi đến appdelegate một tạo một instance variable chứa bạn CustomWindowController
  8. cuối điều bạn phải làm là nhanh chóng CustomWindowController bạn self.customWindowController = [[AccountWindowController alloc] initWithWindowNibName:@"CustomWindow"]; và hiển thị các cửa sổ [self.customWindowController showWindow:nil] trong - (void)applicationDidFinishLaunching:(NSNotification *)aNotification

Dưới đây là một dự án ví dụ https://www.dropbox.com/s/ft3t7w72806tnoe/CustomWindowController.zip

+0

Trong khi tôi đánh giá cao bạn đã dành thời gian để trả lời, đây là một bản sao của câu trả lời của iluvcapra. – 11684

+0

Bạn hoàn toàn đúng. Tôi không thấy điều đó! Chỉ cần làm điều tương tự ở đây và nghĩ rằng tôi trả lời nó một cách nhanh chóng. – tuna

+0

@tuna ur trả lời là hữu ích hơn mặc dù vì nó đã hướng dẫn từng bước –

Các vấn đề liên quan