2012-02-29 10 views
1

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

- (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]; 
} 

は私が

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

としてapplicationDidFinishLaunching:を追加してみましたが、私は、アプリケーションが完全にはまだ発売されていませんawakeFromNib:-[AppDelegate bounds]: unrecognized selector sent to instance

答えて

3

のエラーが表示されます。

ここに私の現在の方法がありますこのNIBファイルのみがアンマーシャリングされています。この時点で、このメソッドは(オブジェクトローカルの)初期化を完了するためのフックを提供します。アプリケーションは、イベントを処理したり、アクションを実行する準備ができていません。

applicationDidFinishLaunching:メソッドからそのアクションをトリガする必要があります。アプリケーションのデリゲートのオプションのメソッドで、boundsというクエリを実行するため、クリックのようなステータス項目を渡す必要があります。 これは私が思っていたよりもトリッキーです。 NSStatusItemには、デリゲートが呼び出された時点で関連付けられたビューがありません。私はそれがNSStatusItemのバグであると言っています。 statusItem.viewapplicationDidFinishLaunching:で呼び出された場合、popoverメソッドは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にこのような矛盾があり、状況項目の隣にポップオーバーがあるのを見たと思うかもしれません。

+0

私はそれを試みましたが、私はまだエラーが発生しています(私の更新された質問を参照してください) 。私は 'clickStatusBar'を間違って呼び出すと思います。 – wigging

+0

あなたはそのアクションをアプリケーションデリゲートで呼び出すことはできません。コンセントをアプリケーションデリゲートに配置し、そのステータスアイテムからコンセントへの接続をIBに入れ、そのコンセント変数またはプロパティを介してアイテム内のアクションを呼び出す必要があります。 – febeling

+0

申し訳ありませんが、混乱しました。 IBOutletの部分は無視してください(それに応じてアスカーを編集します)。あなたはステータス項目をアクションの送信者として期待しています。したがって、プログラムで呼び出すときは、現在のところでは 'self'のところに渡す必要があります。 (私は、上記のコードはコントローラかアプリケーションデリゲートであると仮定し、ポップオーバーは既にクリックして動作します) – febeling

関連する問題