2010-04-11 9 views
1

J'ai du code qui fonctionne très bien pour ajouter un bouton à la barre d'outils:Comment puis-je supprimer un bouton de la barre d'outils d'un contrôleur de vue sur l'iPhone?

NSArray* toolbarItems = [NSArray arrayWithObjects:flexibleSpace,shuffleBarItem,flexibleSpace,nil]; 
self.toolbarItems = toolbarItems; 

Cependant, je veux aussi être en mesure de supprimer des éléments de la barre d'outils. Lorsque j'utilise la méthode ci-dessous, mon application se bloque:

NSArray* toolbarItems = [NSArray arrayWithObjects:flexibleSpace,nil]; 
self.toolbarItems = toolbarItems; 

Est-ce que quelqu'un sait comment je peux modifier dynamiquement la barre d'outils sur l'iPhone?

Merci!

Répondre

1

le changement dans un NSMutableArray.

NSMutableArray* _toolbarItems = [NSMutableArray arrayWithCapacity: 3]; 
[ _toolbarItems addObjects: flexibleSpace,shuffleBarItem,flexibleSpace,nil]; 

self.toolbarItems = _toolbarItems; 

Lorsque vous souhaitez supprimer les éléments du tableau:

NSInteger indexOfItem = ... 
[ _toolbarItems removeObjectAtIndex: indexOfItem ]; 

self.toolbarItems = _toolbarItems; 

Notez que dans ce cas, vous ne devez pas utiliser removeObject puisque vous avez répéter des objets dans votre tableau, et appelant [ _toolbarItems removeObject: flexibleSpace ] supprimera effectivement les deux instances de flexibleSpace dans le tableau

+0

Tout cela fonctionnera, mais il ne mettra pas à jour l'affichage de la barre d'outils. Vous devez appeler setToolbarItems: (d'une manière ou d'une autre) pour déclencher la mise à jour. –

+0

Également le code ci-dessus qui se bloque, n'est pas le cas. Quelque chose d'autre provoque le crash. –

+0

@paull Affectation de propriétés ** implicitement ** appels 'setToolbarItems' :) –

1

Pour supprimer des éléments à l'avant ou à l'arrière, vous pouvez utiliser subarrayWithRange, par exemple:

NSRange allExceptLast; 
allExceptLast.location = 0; 
allExceptLast.length = [self.toolbarItems count] - 1; 
self.toolbarItems = [self.toolbarItems subarrayWithRange:allExceptLast]; 

Si vous souhaitez supprimer des objets du milieu, vous pouvez soit utiliser -[NSArray filteredArrayUsingPredicate:] (qui pourrait être trop compliqué), ou la force brute:

NSMutableArray *mutToolbarItems = [NSMutableArray arrayWithArray:self.toolbarItems]; 
[mutToolbarItems removeObjectAtIndex:<index of object>]; 
self.toolbarItems = mutToolbarItems; 

Notez que vous ne devez pas envoyer à removeObjectAtIndex:self.toolbarItems directement (même si vous utilisez la méthode ci-dessus), puisque toolbarItems est exposé comme NSArray --you'll un avertissement du compilateur, et peut-être un accident (puisque vous ne contrôlez pas si elle sera effectivement mis en œuvre comme un NSMutableArray derrière les scènes).

+0

Je suis d'accord qu'il est probablement préférable de le traiter comme NSArray, même si Jacob avait raison de pouvoir envoyer removeObjectAtIndex.de toute façon, cette ligne bloque mon application - NSMutableArray * mutToolbarItems = [NSMutableArray arrayWithArray: self.toolbarItems]; – Tony

+0

Faites-vous cela avant d'avoir défini 'self.toolbarItems'? Si c'est le cas, cela provoquerait un crash. Sinon, je suppose que vous êtes en train de relâcher 'self.toolbarItems' quelque part. L'envoyez-vous jamais 'release'? (Vous ne devriez pas, puisque chaque fois que vous le définissez, il va automatiquement libérer l'ancienne valeur.) – shosti

Questions connexes