2010-04-23 18 views
9

Tôi có một ứng dụng Cocoa đơn giản sử dụng lớp con NSWindowController. Trong nib tôi đã thiết lập: lớpNSWindowController windowDidLoad không được gọi là

  • tập tin của chủ sở hữu để NSWindowController lớp con tôi
  • Các 'Window' ổ cắm của Chủ đầu tư của tập tin với NSWindow chính trong nib.

Phương pháp init của lớp con NSWindowController được gọi là (tôi gọi là siêu), nhưng không quan trọng những gì tôi làm windowDidLoad không bao giờ được gọi.

Tôi phải thiếu điều gì đó hiển nhiên, nhưng đối với cuộc sống của tôi, tôi không thể hiểu được nó là gì.

+0

Bạn đang khởi tạo lớp như thế nào? Bạn đang gọi thực hiện siêu của '-initWithWindowNibName:'? –

+0

Lớp con NSWindowController của tôi được khởi tạo trong nib, như tài liệu này nói về: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/ObjCTutorial/06Controller/06Controller.html#//apple_ref/doc/ uid/TP40000863-CH8-SW1 Về cơ bản, MainMenu.xib tạo ra nó –

+0

Tôi gặp phải loại vấn đề tương tự: Tôi không nhận được cuộc gọi đến '- (void) windowDidLoad'. Sau khi đào một số tôi tìm thấy sai lầm của tôi trong lớp con NSWindowController của tôi tôi đã tuyên bố 'cửa sổ' là tài sản.Tôi đã loại bỏ thành viên đó và gọi phương thức 'showWindow:' để có được cửa sổ thành công. – Raviprakash

Trả lời

22

Bạn đang cố gắng tạo phiên bản NSWindowController bằng cách khởi tạo nó trong một ngòi bút khác. Tuy nhiên, khi bạn khởi tạo một đối tượng trong một tệp nib, nó được khởi tạo bằng cách gọi -initWithCoder:.

-initWithCoder: không phải là bộ khởi tạo được chỉ định là NSWindowController, vì vậy trường hợp của bạn NSWindowController không bao giờ thực sự tải ngòi bút.

Thay vì instantiating NSWindowController dụ của bạn bằng cách đặt nó trong MainMenu.xib tập tin trong giao diện Builder, tạo ra nó lập trình:

Trong AppDelegate.h:

@class YourWindowController; 
@interface AppDelegate : NSObject 
{ 
    YourWindowController* winController; 
} 
@end 

Trong AppDelegate.m:

@implementation AppDelegate 
- (void)applicationDidFinishLaunching:(NSNotification*)notification 
{ 
    winController = [[YourWindowController alloc] init]; 
    [winController showWindow:self]; 
} 
- (void)dealloc 
{ 
    [winController release]; 
    [super dealloc]; 
} 
@end 

Trong YourWindowController.m:

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

cảm ơn! đánh giá cao sự giúp đỡ. –

14

Đó là hoàn toàn tốt đẹp để nhanh chóng điều khiển cửa sổ thông qua một ngòi. Thay vì sử dụng windowDidLoad làm móc nối của bạn, trong trường hợp đó bạn sẽ muốn sử dụng awakeFromNib.

+0

Tuyệt vời! Cảm ơn bạn. – ArtOfWarfare

0

nếu bạn đã viết

TTEst *test3 = (TTEst *)[[NSWindowController alloc] initWithWindowNibName:@"TTEst"]; 

thử thay

TTEst *test3 = [[TTEst alloc] initWithWindowNibName:@"TTEst"]; 

nó làm cho sự khác biệt! Tất nhiên dòng đầu tiên là một sai lầm ...

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