1

Dans mon UIViewController, je souhaite ajouter un UIBarButtonItem dans la barre d'outils, mais le nouveau bouton n'apparaît pas. Qu'est-ce que je fais mal?NSOperationQueue: Impossible d'ajouter UIBarButtonItem dans la barre d'outils du thread principal

- (void)doLogin:(NSString *)name password:(NSString *)password { 
// 1.: start the Thread: 
NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(backgroundTaskLogin:) object:request]; 
[self.opQueue addOperation:invOperation]; 
} 

- (void)backgroundTaskLogin:(NSString *)request2 { 
// 2.: jump back in the Main Thread in show a cancel button in den toolbar: 
[self performSelectorOnMainThread:@selector(showCancelButton) withObject:nil waitUntilDone:NO]; 
} 

- (void)showCancelButton { 
// 3.: add a new Cancel-Button in the Toolbar: 
UIBarButtonItem *tempButtonCancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelLogin)]; 
NSMutableArray *myButtons = (NSMutableArray *)self.toolbarItems; 
NSLog(@"Count buttons: %d", [self.toolbarItems count]); // DEBUGGER: 2 

[myButtons addObject:tempButtonCancel]; 
[tempButtonCancel release]; 

NSLog(@"Count buttons: %d", [self.toolbarItems count]); // DEBUGGER: 3 

// PROBLEM: I don't see the new Toolbar-Button :-(
} 

Répondre

2

Vous ne pouvez pas compter sur self.toolbarItems être un tableau mutable. Cela peut être le cas dans votre cas si vous avez affecté un tableau mutable à cette propriété auparavant, mais vous ne pouvez pas attendre du contrôleur de vue qu'il remarque une modification dans une propriété si vous n'utilisez pas l'interface documentée.

Créer un nouveau tableau et utiliser le setter pour l'assigner à toolbarItems:

NSMutableArray *newToolbarItems = [NSMutableArray arrayWithArray:self.toolbarItems]; 
[newToolbarItems addObject:tempButtonCancel]; 
self.toolbarItems = newToolbarItems; 
+0

Dans mon cas, j'attribué une gamme mutable à « ToolbarItems », mais vous avez raison, [NSMutableArray arrayWithArray: self.toolbarItems] œuvres. Merci beaucoup! – Manni

0

Le code dans le poste de Ole va corriger votre bug, mais pas pour la raison qu'il suggère (car il semble que vous êtes en ajoutant un élément au tableau, même si cela ne devrait pas être modifiable la plupart du temps). Vous devez appeler setToolbarItems: après avoir dupliqué et modifié le tableau d'éléments car l'UIToolbar ne détecte pas que des modifications ont été apportées à son tableau dans le cas contraire.

Vous pouvez également utiliser setToolbarItems:animated: pour estomper les choses bien ;-)

+0

Bonne clarification, Ben. C'est ce que je voulais dire par "vous ne pouvez pas vous attendre à ce que le contrôleur de vue remarque un changement dans une propriété si vous n'utilisez pas l'interface documentée". –

+0

Ce n'est pas parce que toolbarItems est mutable qu'il devrait l'utiliser comme un tableau mutable s'il n'est pas déclaré mutable dans l'en-tête. Cela pourrait casser dans n'importe quelle version d'iOS. – gcamp

+0

[self setToolbarItems: myButtons animé: YES] fonctionne aussi, en combinaison avec l'indice d'Ole, merci! – Manni