ステータスアイテムの作成 - アイコンが表示されます。メニューは表示されません。

ドキュメントベースのプロジェクトでは、ステータスメニューを作成しようとしています。私はステータスバーを構築するシングルトンクラスを持っています。あなたが見るように、アプリケーションデリゲートからそれを開始しています。これを実行すると、エラーは表示されず、ステータスバーの画像だけが表示されますが、メニューは表示されません。私はIBでメニューを作った。私は何を台無しにしていますか?

代議員

#import "KBApp代議員.h"
#import "KBStatusMenu.h"

@implementation KBApp代議員
@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{
    KBStatusMenu *aStatusItem = [[KBStatusMenu alloc] init];
    aStatusItem = [[KBStatusMenu instance] buildStatusItem];
}
@end

.h

#import 

@interface KBStatusMenu : NSObject 
{
    NSStatusItem *myStatusItem;
    NSImage *statusImage;
    IBOutlet NSMenu *myStatusMenu;
}

+ (KBStatusMenu *)instance;
- (id)buildStatusItem;

@end

.m

#import "KBStatusMenu.h"

@implementation KBStatusMenu
static KBStatusMenu *gInstance = nil;

+ (KBStatusMenu *)instance 
{
    @synchronized(self) {
        if (gInstance == nil)
            gInstance = [[self alloc] init];
    }

    return(gInstance);
}

- (id)buildStatusItem 
{
    myStatusItem = [[[NSStatusBar systemStatusBar]         statusItemWithLength:NSSquareStatusItemLength] retain];
    statusImage = [NSImage imageNamed:@"statusNormTemplate.png"];
    [myStatusItem setImage:statusImage];
    [myStatusItem setHighlightMode:YES];
    [myStatusItem setMenu:myStatusMenu];
    return myStatusItem;
}

@end
0
なぜ alloc init を使って独自のインスタンスを作成し、それを共有インスタンスに置き換えるのですか?
追加された 著者 Peter Hosey,
myStatusMenu が実際に存在していますか? (私は非ですか?)
追加された 著者 Francis McGrew,

1 答え

あなたはコンセントとして myStatusMenu を宣言しましたが、ペン先をロードしませんでした。コンセントはどこからでもオブジェクトを取得することはできません。コンセントが何かに接続されているペン先をロードしたとき(またはコンセントでないかのように何かを自分自身に変数に割り当てたとき)にのみコンセントが設定されます。

これを証明するには、 myStatusMenu インスタンス変数の値を記録する buildStatusItem に行を追加します。私はそれが nil となることを期待しています。

あなたがする必要があるのは次のとおりです:

  1. ステータス項目のメニューを含むペン先を作成します。
  2. ファイルの所有者のクラスを KBStatusMenu に設定します。
  3. KBStatusMenuで、作成したペン先をロードするために init を実装します。

次に、 buildStatusItem に達すると、ペン先をロードするとコンセントが設定され、ステータス項目に与えるメニューが表示されます。

1つの KBStatusMenu インスタンスを作成することをお勧めします。この場合、シングルトンを強制することをお勧めします。 init gInstance が既に設定されているかどうかをテストし、そうであればそれを返します。 self を初期化して返す必要がない場合に限ります。

0
追加された
はい、 'myStatusMenu'はゼロです! (修正に戻る)
追加された 著者 janeh,
"1.ステータス項目のメニューを含むペンを作成する" - MainMenu.xib内に作成されたステータスメニューを持っていました
追加された 著者 janeh,
分かりました!ありがとう!
追加された 著者 janeh,
@janeh:KBStatusMenuはそれを知る方法がないので、それは役に立たない。これはMainMenuペン先ではなく、MainMenuペン先を所有していません。アプリケーションがMainMenuペン先を所有していて、MainMenuペン先のKBStatusMenuの作成が正しいとは思わないので、私の提案です。KBStatusMenuを新しいペン先にして所有してください。
追加された 著者 Peter Hosey,