2011-12-15 43 views
2

我正在通過幾個示例代碼庫和教程,只是完全磕磕絆絆,很多是因爲這些教程是爲Xcode < 4.2編寫的,而ARC改變了一些東西。Mac開發大樓基本界面

我正在嘗試構建一個MVC設計模式的接口。我正在使用爲應用程序委託提供的基本模板。我添加了一個名爲MainWindowController的類,該類繼承自NSWindowController。在界面生成器中,首先我刪除了MainMenu nib文件中的Window對象(因爲我希望它在一個單獨的文件中)。我創建了一個名爲MainWindow的新接口(.xib)。我將文件所有者更改爲MainWindowController,並將該委託添加到對象列表中。現在在這一點上沒有點擊。

我不完全掌握如何或需要實現哪些內容才能使委託實質上加載並啓動窗口控制器。首先,我嘗試將窗口中的「委託」出口連接到實際的應用程序委託(稱爲AppDelegate),然後將委託類中的窗口出口鏈接到接口生成器中的窗口。

我想要一個答案,但我會更樂意描述這個過程的正確文檔。我確定MacDev上有某些東西,但我很難找到它。

這裏就是我的工作:

@class MainWindow; 

    @interface AppDelegate : NSObject <NSApplicationDelegate> 


    @property (strong) MainWindow *mainWindowController; 
    @property (assign) IBOutlet NSWindow *window; 

    @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; 
    @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; 
    @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

    - (IBAction)saveAction:(id)sender; 

    @end 

...

@implementation AppDelegate 

    @synthesize window; 
    @synthesize mainWindowController; 
    @synthesize persistentStoreCoordinator = __persistentStoreCoordinator; 
    @synthesize managedObjectModel = __managedObjectModel; 
    @synthesize managedObjectContext = __managedObjectContext; 

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
    { 
     MainWindow *controller = [[MainWindow alloc] initWithWindowNibName:@"MainWindow"]; 
     mainWindowController = controller; 

    // ... the rest handles the ManagedObject Models... 

解決時間:

@synthesize mainWindowController = _mainWindowController; // IBOutlet is linked in IB 
//... 
- (void) applicationDidFinishLaunching: (NSNotification *) aNotification 
{ 
    //... initialization of event handling etc... 
    if (!_mainWindowController) _mainWindowController = [[ MainWindowController alloc] initWithWindowNibName:@"MainWindow"]; 
    [_mainWindowController showWindow: self]; 
    // ... 

應用程序委託可以在主管理一個NSWindow nib文件,也可以將該任務委託給基於文檔的應用程序的典型控制器(NSWindowController) ations或MVC設計模式。 Basic-info.plist指定的缺省nib文件定義了哪個nib文件被加載。通常情況下,默認的筆尖應該是主菜單,它也會加載委託。然後,代理應該通過applicationDidFinishLoading:或awakeFromNib:執行控制器的初始化,並根據委託和mvc設計模式繼續適當的委派。

我遇到的主要問題是啓動窗口,這是由showWindow完成的:。這個問題的惡化源於一個非常老的Mac OS X項目的源代碼,該項目使用了不推薦使用的函數和方法來完成委派並導致我走錯了路。感謝您的回答,最終讓我在正確的地方尋找正確的問題,並找到了正確的答案。

回答

1

你的問題是,在第二廈門國際銀行,「主窗口」,正在創建一個新AppDelegate對象有絕對無關,與在「MainMenu的」廈門國際銀行的AppDelegate對象。每個xib中的對象都是實際的對象,它們被序列化並在運行時加載。

此特定問題將在資源管理指南"Nib Loading"中解決。我也可以建議"Core Application Design"