我有一个基于文档的应用程序的工具栏包含几个NSButton,我需要验证。基于这里的其他代码,我子类化了NSToolbar:
@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
MyDocument(文件的所有者)被设置为工具栏的委托。然而
-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem
永远不会被调用。按钮上有一个动作设置,所以不确定为什么[responder respondsToSelector:toolbarItem。
我已经尝试子类化NSButton项目:
@interface DocumentToolbarActionItem : NSToolbarItem
@implementation DocumentToolbarActionItem
-(void)validate
{
Document* document = [[self toolbar] delegate];
[self setEnabled:[document validateUserInterfaceItem:self]];
}
@end
但是这会导致一个无限循环。
文档的validateUserInterfaceItem:方法适用于应用程序中的所有其他项目,我需要我的工具栏按钮调用它来确定它们是否应该启用
我的猜测是,您没有通过[super validateVisibleItems]
调用,因此,通过响应器链失去验证的超类行为。