2011-12-15 7 views
2

私はいくつかのサンプルコードバンクとチュートリアルを見ていますが、ちょうど完全に抱えています。多くのことは、これらのチュートリアルがXcode < 4.2用に書かれていて、Mac Development Building基本的なインターフェイス

MVCデザインパターンでインターフェイスを構築しようとしています。私はApplication Delegateに提供されている基本テンプレートを使用しています。 NSWindowControllerを継承するMainWindowControllerというクラスを追加しました。 Interface Builderでは、まずMainMenu nibファイルのWindowオブジェクトを削除しました(別のファイルに入れたいからです)。 MainWindow(.xib)という名前の新しいインターフェイスを作成します。ファイルの所有者をMainWindowControllerに変更します。オブジェクトリストにDelegateを追加します。今、この時点で何かがクリックされていません。

私は、デリゲートが本質的にウィンドウコントローラをロードして起動するために、実装する必要がある方法や内容を完全には把握していません。最初に、私は、アウトレットを "delegate"のためにウィンドウ内で実際のアプリケーションデリゲート(AppDelegateと呼ぶ)にリンクさせてから、DelegateクラスのウィンドウアウトレットをInterface Builderのウィンドウにリンクしようとしました。

私はこれに対する答えが欲しいですが、私はこのプロセスを説明している正しい文書にもっと満足しています。私はMacDevに何かがあると確信していますが、私はそれを見つけるのが難しいです。アプリケーションデリゲートがメインにNSWindowのを管理することができます

@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]; 
    // ... 

:日付へ

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

ソリューション:ここ

は、私が働いているものですnibファイルを作成したり、そのタスクをドキュメントベースのアプリケーションの典型的なコントローラ(NSWindowController)に委譲できますまたはMVCデザインパターン。 Basic-info.plistで指定されたデフォルトのnibファイルは、どのnibファイルがロードされているかを定義します。通常、デフォルトのnibはデリゲートをロードするメインメニューでなければなりません。デリゲートは、applicationDidFinishLoading:またはawakeFromNib:コントローラの初期化を行い、デリゲートとmvcデザインパターンに従って適切なデリゲーションを続行する必要があります。

私が持っていた主な問題は、showWindowによって行われるウィンドウを起動することでした。この問題の悪化は、廃止された機能とメソッドを使用して委任を達成し、間違った経路を導いた、非常に古いMac OS Xプロジェクトのソースコードに起因していました。答えをありがとう、それは最終的に私は正しい質問のための正しい場所を見ていたと私は正しい答えを見つけた。

答えて

1

あなたの問題は、第2 XIB、「メインウィンドウ」で、新しいAppDelegateオブジェクトは、「メインメニュー」XIBにAppDelegateオブジェクトとは全く関係ありませんが作成されていることです。各xibのオブジェクトは、シリアル化されて実行時にロードされる実オブジェクトです。

この特定の問題は、リソース管理ガイド"Nib Loading"で解決されます。私は"Core Application Design"を提案することもできます。