2010-12-17 55 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

從標題:通常你不應該調用這個方法。在窗口更新時調用此方法,目的是驗證每個可見項目的 。 – 2017-04-12 10:49:35

6

的問題是,NSToolbar只發送驗證信息到NSToolbarItem的是圖像類型,其中沒有我的人的。爲了驗證任何或全部NSToolbarItems,創建一個NSToolBar的自定義子類並覆蓋validateVisibleItems:方法。這會將驗證消息發送給所有可見的NSToolbarItem。唯一真正的區別在於,不必讓Toolbar類使用返回的BOOL啓用或禁用該項目,而需要在驗證方法本身中啓用或禁用該項目。

@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爲方法的控制器:

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

將在處理工具欄項目的動作相同的控制器執行以下操作:

-(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項目中工作,所以如果有一個人(除了你)可以驗證你的答案,我會將其標記爲正確的。謝謝 – 2013-03-06 15:50:05

+0

謝謝。在回答這樣一個老問題時,我感到有些尷尬,但是我花了很大力氣尋找解決方案,並且在將幾個概念拼湊成一些不是很大的混亂的東西之後,我認爲分享它是個好主意。我知道它是有效的,但我真正想知道的是,如果有更好的解決方案,或者我做了一些不合適的事情。 – 2013-03-06 20:04:57