Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

dgrenier

macrumors newbie
Original poster
Feb 25, 2008
8
0
This one have been puzzled me for the last few days. I'm trying to implement a toolbar in my app, and whatever I do, my toolbar items stay disabled. I've nailed the problem to the fact that validateToolbarItem doesn't get called, even thought both items have (I think) a valid target/action pair.

I've red the documentations as well as did some research both here and on Google, but couldn't find anything helpful. Anybody got a clue?

Here's the code I've been using:

Code:
@implementation MainWindowController

NSString *const kProjectTitle							= @"CustomProjectsView";
NSString *const kClientTitle							= @"CustomClientsView";
static NSString* kProjectsToolbarItemIdentifier			= @"Projects Toolbar Item Identifier";
static NSString* kClientsToolbarItemIdentifier			= @"Clients Toolbar Item Identifier";

enum	// popup tag choices
{
	kProjectView = 0,
	kClientView = 1,
};

- (void)awakeFromNib
{
	NSLog(@"awakeFromNIB");
	[self changeViewController: kClientView];
	
	NSToolbar *toolbar = [[[NSToolbar alloc] initWithIdentifier:@"MainToolbar"] autorelease];
	
	[toolbar setDelegate:self];
	[toolbar setAllowsUserCustomization:NO];
	[toolbar setAutosavesConfiguration:YES];
	
	[mainWindow setToolbar:toolbar];
}

- (void)changeViewController:(NSInteger)whichViewTag
{
	// Code for changing the view here
}

- (NSViewController*)viewController
{
	NSLog(@"viewController");
	return myCurrentViewController;
}

#pragma mark Toolbar Delegate Methods

- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
{
	NSLog(@"toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar:");
	NSToolbarItem *toolbarItem = nil;
    
    if ([itemIdentifier isEqual: kProjectsToolbarItemIdentifier])
	{
        toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease];
		
		[toolbarItem setLabel:@"Projets"];
		[toolbarItem setPaletteLabel:@"Projets"];
		
		[toolbarItem setToolTip:@"Affiche les projets"];
		[toolbarItem setImage: [NSImage imageNamed: @"SaveDocumentItemImage"]];
		
		[toolbarItem setTarget: self];
		[toolbarItem setAction:@selector(changeViewController:kProjectView:)];
	}
	else if([itemIdentifier isEqual: kClientsToolbarItemIdentifier])
	{
		toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease];
		
		[toolbarItem setLabel:@"Clients"];
		[toolbarItem setPaletteLabel:@"Clients"];
		
		[toolbarItem setToolTip:@"Affiche les clients"];
		[toolbarItem setImage: [NSImage imageNamed: @"SaveDocumentItemImage"]];
		
		[toolbarItem setTarget: self];
		[toolbarItem setAction:@selector(changeViewController:kClientView:)];
	}
	else
	{
		toolbarItem = nil;
	}
	
	return toolbarItem;
}

- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
{
	NSLog(@"toolbarAllowedItemIdentifiers:");
	return [NSArray arrayWithObjects: kProjectsToolbarItemIdentifier, kClientsToolbarItemIdentifier, nil];
}

- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar
{
	NSLog(@"toolbarDefaultItemIdentifiers:");
	return [NSArray arrayWithObjects: kProjectsToolbarItemIdentifier, kClientsToolbarItemIdentifier, nil];
}

-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem
{
	NSLog(@"validateToolbarItem:");
	return YES;
}

- (void) toolbarWillAddItem: (NSNotification *) notif {
	NSLog(@"toolbarWillAddItem:");
}

@end
 

kainjow

Moderator emeritus
Jun 15, 2000
7,958
7
You're setting up the selector incorrectly. Try changing it to:

Code:
- (void)changeViewController:(NSToolbarItem *)item
{
    // Code for changing the view here
}

...

[toolbarItem setAction:@selector(changeViewController:)];

Set the tag on the toolbar item to one of your enum values and then check for it in the action method.
 

dgrenier

macrumors newbie
Original poster
Feb 25, 2008
8
0
Ah, man, I don't know wether I should thank you for finding it so quickly, or just hate you because you pointed a so obvious mistake... :cool:
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.