1

私のプロジェクトはドキュメント ベースで、ステータス メニューをロードするコードは、awakeFromNib の下に配置した場合にのみ実行されます。

#import "StatusMenuAppDelegate.h"

@implementation StatusMenuAppDelegate

@synthesize window = _window;

-(void)awakeFromNib {
    myStatusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
statusImage = [NSImage imageNamed:@"statusNorm.png"];
[myStatusItem setImage:statusImage];
[myStatusItem setHighlightMode:YES];
[myStatusItem setMenu:myStatusMenu];
}
@end

しかし、私のテスト プロジェクト (非ドキュメント ベース) では、コードはapplicationDidFinishLaunchingで正常に実行されます。なんで?この機能をステータス メニューに理想的に使用したいと思いませんか?

4

1 に答える 1

1

メッセージは、applicationDidFinishLaunching:アプリケーションオブジェクトによってそのデリゲートに送信されます。他のオブジェクトには送信されません。

ドキュメントオブジェクトでそのメッセージに応答することはできますが、何も送信されないため、メッセージを受信することはありません。そのため、ドキュメントオブジェクト、またはアプリケーションのデリゲートではない他のオブジェクトでそのメソッドを実行しても、何も起こりません。

awakeFromNibステータスアイテムを作成できる場所の1つです。私はおそらくでそれをしwindowControllerDidLoadNib:ます。

これは、ドキュメントごとに1つのステータスアイテムが本当に必要であると想定していますが、これはおそらく意味がありません。それが望ましくない場合は、ステータスアイテムの作成、所有権、および管理をシングルトンオブジェクトに移動する必要があります。このオブジェクトはapplicationDidFinishLaunching:、アプリケーションのデリゲートによって(おそらく内部で)作成され、必要に応じてすべてのドキュメントがそのオブジェクトと対話するようにする必要があります。 。

于 2011-12-16T01:25:33.290 に答える