2

私は Xcode 4.6.3 を使用しており、「Cocoa Application」テンプレートを使用して新しいプロジェクトを作成しました。デフォルトの構造は私には少しおかしくなり、それが推奨される構造かどうか疑問に思っていました。

具体的には、テンプレートによって作成される 3 つのファイルは次のとおりです。

  • MainMenu.xib
  • AppDelegate.h
  • AppDelegate.m

このMainMenu.xibファイルには、メイン メニューの定義とメイン ウィンドウの定義が含まれています。という名前のファイルでメイン ウィンドウを定義するのは、私には奇妙に思えますMainMenu.xibこれは、メイン ウィンドウを定義するための推奨される場所ですか?

のようなファイルが表示されることを期待しておりMainWindow.h、からMainWindow.mサブクラス化されていNSViewControllerます。テンプレートから作成された現在の構造により、アプリ デリゲートでメイン ウィンドウ イベントのハンドラーを作成することになります。これも私には奇妙に思えます。メイン ウィンドウのアウトレットとハンドラーをアプリ デリゲートに配置することをお勧めしますか?

4

1 に答える 1

2

私が最初にすることの1つは、その窓を引き裂くことです。

NSViewController からサブクラス化された MainWindow.h や MainWindow.m のようなファイルが表示されることを期待していました。

ビュー コントローラーはウィンドウではなく、ウィンドウはビュー コントローラーではありません。

私が (MainMenu nib からウィンドウを削除した後) 行うことは、Objective-C クラス ファイル テンプレートを使用してウィンドウコントローラー サブクラスを作成し、「and a nib, too, please」オプション (スーパークラスが NSViewController またはNSWindowController)。

(後で nib を選択し、File Inspector のボタンをクリックしてローカライズ可能にすることを忘れないでください。Xcode は何らかの理由でデフォルトでそれを行わないためです。)

サブクラスの実装では、次のようなものがあります。

@implementation MyWindowController

- (instancetype) init {
    return [self initWithWindowNibName:NSStringFromClass([self class])];
}

//and all my app-specific stuff

@end

アプリ デリゲートで、MainMenu で生成されたウィンドウを参照していたアウトレットを削除してから、ウィンドウ コントローラーを作成します。

@implementation MyAppDelegate
{
    MyWindowController *_wc;
}

- (void) applicationWillFinishLaunching:(NSNotification *)notification {
    _wc = [MyWindowController new];
    [_wc showWindow:nil];
}

- (void) applicationWillTerminate:(NSNotification *)notification {
    [_wc close];
    _wc = nil;
}

@end

(私は ARC を使用しています。使用していない場合はrelease、そこにメッセージを追加してください。)

メイン ウィンドウのアウトレットとハンドラーをアプリ デリゲートに配置することをお勧めしますか?

いいえ。これは、アプリケーションのデリゲートが行うべきことの範囲外です。

非常に単純な1ウィンドウ アプリの場合、ウィンドウ コントローラーをアプリケーションのデリゲートにすることができます。しかし、それでさえも、ウィンドウ コントローラーではないアプリケーション デリゲートにアクションを処理させたり、データ ソースにしたりすることとは異なります。アプリのデリゲート。

常に別々に保管しています。単純なケースでは少し余分な作業になりますが、私のプロジェクトはよりきれいになり、それが私を幸せにします。

于 2013-06-22T21:39:48.763 に答える