1

システムメニューバーにステータス項目があり、クリックするとポップオーバーが表示されます。アプリケーションを最初に起動したときにポップオーバーが自動的に表示されるようにしたいと思います。awakeFromNibメソッドにを追加しようとしました[self clickStatusBar:self]が、機能しません。誰もがこれを達成する方法を知っていますか?

これが私の現在の方法です:

- (void)awakeFromNib {
    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [statusItem setTitle:@"Locating..."];
    [statusItem setTarget:self];
    [statusItem setAction:@selector(clickStatusBar:)];
    [statusItem setHighlightMode:YES];
}

- (void)clickStatusBar:(id)sender {
    [[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMinYEdge];
}

applicationDidFinishLaunching:として追加してみました

- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    [self clickStatusBar:self];
}

しかし、私はのエラーを取得します -[AppDelegate bounds]: unrecognized selector sent to instance

4

1 に答える 1

3

awakeFromNib:アプリケーションはまだ完全には起動されていませんが、このNIBファイルのみがアンマーシャリングされています。この時点で、このメソッドは(オブジェクトローカル)初期化を完了するためのフックを提供します。アプリケーションは(かなり可能性が高いですが)イベントを処理したりアクションを実行したりする準備ができていません。

アプリケーションデリゲートのオプションのメソッドであるメソッドからそのアクションをトリガーしapplicationDidFinishLaunching:、クリックのようにステータスアイテムを渡す必要があります(クエリを実行するためbounds)。

アップデート。これは私が思っていたよりも難しいです。結局のところ、NSStatusItemには、デリゲートが呼び出されたその時点で関連付けられたビューがありません。私はそれがのバグだと思い切って言いたいと思いNSStatusItemます。でがstatusItem.view呼び出されるとapplicationDidFinishLaunching:、ポップオーバーメソッドが受信nilして文句を言います。

私が見つけた唯一の(部分的な、以下を参照)回避策は、次のawakeFromNib:ように手動でボタンをビューとして設定することです。

- (void)awakeFromNib
{
  self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];

  self.statusItemButton = [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, 83, 22)];
  self.statusItemButton.title = @"Locating...";
  self.statusItemButton.bordered = NO;
  [self.statusItemButton setAction:@selector(clickStatusBar:)];

  self.statusItem.view = self.statusItemButton;
}

そうすれば、アプリケーションの起動が完了したときの様子を見ることができます。ただし、デフォルトのようには見えないことに注意してください。

PS。そして不思議なことに、そして毎回動作するわけではありません。ここにボールを落とさなければなりません。ごめん。たぶん、誰かがクリックしたときにデフォルトで場所を保存します。Cloud.appで、ステータスアイテムの横にポップオーバーが表示されているので、このような不整合が見られたと思います。おそらく、理由がわかりました:)

于 2012-02-29T18:18:05.423 に答える