私が最初にすることの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ウィンドウ アプリの場合、ウィンドウ コントローラーをアプリケーションのデリゲートにすることができます。しかし、それでさえも、ウィンドウ コントローラーではないアプリケーション デリゲートにアクションを処理させたり、データ ソースにしたりすることとは異なります。アプリのデリゲート。
常に別々に保管しています。単純なケースでは少し余分な作業になりますが、私のプロジェクトはよりきれいになり、それが私を幸せにします。