2010-12-17 10 views
5

私はこの変な振る舞いをしています。私は、アプリケーションがいくつかの情報を待っているときにユーザーに表示するためのテキストパネルを使用しています。このパネルは、ユーザーが何かをクリックしないようにモーダルに表示されます。NSToolBar検証を強制するには?

ロードパネルが非表示になると、ツールバーのすべての項目が無効になり、validateToolbarItemメソッドが呼び出されません。

私は、このようにパネルを示すよ:

- (void)showInWindow:(NSWindow *)mainWindow { 
sheetWindow = [self window]; 
[self sheetWillShow]; 

[NSApp beginSheet:sheetWindow modalForWindow:mainWindow modalDelegate:nil didEndSelector:nil contextInfo:nil]; 
[NSApp runModalForWindow:sheetWindow]; 
[NSApp endSheet:sheetWindow]; 
[sheetWindow orderOut:self]; 
} 

- (void)dismissModal { 
[sheetWindow close]; 
[NSApp stopModal]; 
} 

どのように私はこのケースで検証するためのツールバーを強制することができますか?コメントの後

編集:

私はすでに試してみました:

  • [[[NSApp mainWindow] toolbar] validateVisibleItems]
  • [[NSApp mainWindow] update];
  • [NSApp updateWindows];
  • [NSApp setWindowsNeedUpdate:YES];

すべて電話後dismissModal。私は

答えて

3
NSToolbar *toolbar; //Get this somewhere. If you have the window it is in, call [window toolbar]; 
[toolbar validateVisibleItems]; 
+0

Fromヘッダー:通常、このメソッドは呼び出さないでください。このメソッドは、可視の項目のそれぞれを の妥当性を検証する目的でウィンドウの更新時に呼び出されます。 –

6

問題はNSToolbarだけNSToolbarItemの鉱山のどれもなかったイメージ・タイプのものであることを検証メッセージを送ることです....問題が他の場所であることを考えています。 NSToolbarItemsのいずれかまたはすべてを検証するには、NSToolBarのカスタムサブクラスを作成し、validateVisibleItems:メソッドをオーバーライドします。これにより、すべての表示可能なNSToolbarItemに検証メッセージが送信されます。実際の違いは、返されたBOOLでアイテムを有効または無効にする代わりに、検証メソッド自体でアイテムを有効または無効にする必要があることです。

- (IBAction)backButton:(NSSegmentedControl*)sender 
{ 
    NSInteger segment = sender.selectedSegment; 
    if (segment == 0) 
    { 
     // Action for first button segment 
    } 
    else if (segment == 1) 
    { 
     // Action for second button segment 
    } 
} 

プレイスツールバー項目のアクションを扱う同じコントローラに以下:今

@interface CustomToolbar : NSToolbar 
@end 
@implementation CustomToolbar 
-(void)validateVisibleItems 
{ 
    for (NSToolbarItem *toolbarItem in self.visibleItems) 
    { 
     NSResponder *responder = toolbarItem.view; 
     while ((responder = [responder nextResponder])) 
     { 
      if ([responder respondsToSelector:toolbarItem.action]) 
      { 
       [responder performSelector:@selector(validateToolbarItem:) withObject:toolbarItem]; 
      } 
     } 
    } 
} 
@end 

は、あなたがあなたのツールバーにNSSegmentedControlためのアクションを処理IBActionメソッドでコントローラを持っていると仮定し

-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem 
{ 
    SEL theAction = [toolbarItem action]; 
    if (theAction == @selector(backButton:)) 
    { 
     [toolbarItem setEnabled:YES]; 

     NSSegmentedControl *backToolbarButton = (NSSegmentedControl *)toolbarItem.view; 
     [backToolbarButton setEnabled:YES forSegment:0]; 
     [backToolbarButton setEnabled:NO forSegment:1]; 
    } 
    return NO; 
} 

この結果、有効または無効になっているセグメントを完全に制御できるようになります。

このテクニックは、アイテムの受信アクションがレスポンダチェーン内のコントローラによって処理されている限り、他のほとんどのNSToolbarItemタイプにも適用する必要があります。

こちらがお役に立てば幸いです。

+0

あなたの答えをありがとう!それは有望だ:)あなたがこの質問を参照してください、かなり古いです。私はもうOSXプロジェクトでは働いていないので、あなたの答えを検証することができる(あなた以外の)ものがあれば、それを正しいものとしてマークします。ありがとう –

+0

ありがとう。このような古い質問にはやや不快な答えがありましたが、私は解決策を模索するために多大な努力を払い、最終的にいくつかのコンセプトを巨大なkludgeではないものに結びつけた後、共有することをお勧めしました。私はそれが動作することを知っているが、私が本当に知りたいのは、よりよい解決策があるか、あるいは適切ではないと思われることをした場合である。 –

関連する問題