2010-12-17 13 views
5

Bu garip davranışları alıyorum. Uygulama bazı bilgileri beklerken kullanıcıya göstermek için metin içeren bir panel kullanıyorum. Bu panel, kullanıcının bir şeyi tıklatmasını engellemek için moda olarak gösterilmektedir.NSToolBar doğrulama nasıl zorlanır?

Yükleme paneli gizlendiğinde, araç çubuğundaki tüm öğeler devre dışı bırakılır ve validateToolbarItem yöntemi çağrılmaz.

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

nasıl bu durumda doğrulamak için araç çubuğunu zorlayabilirsiniz:

ben bu şekilde paneli gösteriyorum? Yorumlarınız sonra

Düzenleme:

Zaten denedim:

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

Aramadan sonra dismissModal. Ben

cevap

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

Başlıkta: Genellikle bu yöntemi çağırmamalısınız. Bu yöntem, görüntülenen öğelerin her birini doğrulamak amacıyla pencere güncellemelerinde çağrılır. –

6

sorun NSToolbar sadece NSToolbarItem en az benimki hiçbiri vardı Görüntü türünden olmakta buna Doğrulama mesajlarını gönderir olmasıdır .... sorun başka yerde olduğunu düşünüyorum. NSToolbarItems'in herhangi birini veya tümünü doğrulamak için, NSToolBar'ın özel bir alt sınıfını oluşturun ve validateVisibleItems: yöntemini geçersiz kılın. Bu, doğrulama mesajlarını TÜM görünür NSToolbarItem'e gönderecektir. Tek gerçek fark, Araç Çubuğu sınıfının öğeyi döndürülen BOOL ile etkinleştirmesini veya devre dışı bırakmak yerine, doğrulama yöntemindeki öğeyi etkinleştirmeniz veya devre dışı bırakmanız gerektiğidir.

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

Yeri araç çubuğu öğesinin Eylem kolları aynı kumanda aşağıdaki: Şimdi

@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 

, kendi araç çubuğunda bir NSSegmentedControl Eylemler işleyen bir IBAction yöntemi ile bir denetleyici var varsayalım

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

Sonuç, hangi bölümlerin etkinleştirildiği veya devre dışı bırakıldığı konusunda tam denetime sahip olmanızdır.

Bu teknik, öğenin Alınan Eylemi yanıtlayıcı zincirindeki bir denetleyici tarafından ele alındığı sürece NSToolbarItem'in hemen hemen her türüne uygulanmalıdır.

Umarım bu yardımcı olur.

+0

Cevabınız için teşekkürler! Umut verici görünüyor :) Gördüğünüz gibi bu soru oldukça eski. Artık herhangi bir OSX projesinde çalışmıyorum, eğer cevabınızı doğrulayabilecek biri varsa (sizden) varsa, doğru olanı işaretleyeceğim. Teşekkürler –

+0

Teşekkürler.Böyle eski bir soruyu cevaplarken biraz garip hissettim, ama bir çözüm arayışına çok çaba harcadım ve nihayetinde birkaç kavramı büyük bir kloz olmadığı bir şeye gömdükten sonra bunu paylaşmanın iyi bir fikir olacağını düşündüm. Çalıştığını biliyorum, ama gerçekten bilmek istediğim, daha iyi bir çözüm varsa veya uygun görülmeyen bir şey yapsaydım. –