2010-04-11 2 views
1

У меня есть код, который работает отлично подходит для добавления кнопки на панели инструментов:Как удалить кнопку с панели инструментов контроллера просмотра на iPhone?

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

Однако, я также хочу, чтобы иметь возможность удалить элементы панели инструментов. Когда я использую метод ниже, мой сбой приложения:

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

Кто-нибудь знает, как я могу динамически изменять панель инструментов на iPhone?

Спасибо!

ответ

1

Измените его на NSMutableArray.

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

self.toolbarItems = _toolbarItems; 

Если вы хотите, чтобы удалить элементы из массива:

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

self.toolbarItems = _toolbarItems; 

Обратите внимание, что в этом случае вы не должны использовать removeObject, так как вы повторяющиеся объекты в массиве, и вызов [ _toolbarItems removeObject: flexibleSpace ] будет фактически удалить оба экземпляра flexibleSpace в массиве

+0

Все это будет работать, но оно не будет обновлять отображение панели инструментов. Вам нужно вызвать setToolbarItems: (так или иначе), чтобы вызвать обновление. –

+0

Также код выше, который вылетает, не работает. Что-то еще вызывает крушение. –

+0

@paull Присвоение свойств ** неявно ** вызывает 'setToolbarItems' :) –

1

Для удаления предметов спереди или сзади, вы можете использовать subarrayWithRange, то есть:

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

Если вы хотите, чтобы удалить объекты с середины, вы можете либо использовать -[NSArray filteredArrayUsingPredicate:] (который может быть слишком сложным), или грубой силы:

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

Обратите внимание, что вы не должны посылать removeObjectAtIndex: в self.toolbarItems (даже если вы используете вышеуказанный метод), так как toolbarItems отображается как NSArray - вы получите предупреждение о компиляторе и, возможно, сбой (так как у вас нет контроля над тем, будет ли он реализован как NSMutableArray сцены).

+0

Я согласен, что, вероятно, лучше рассматривать его как NSArray, хотя Джейкоб был прав, что я могу отправить removeObjectAtIndex.во всяком случае, эта строка вызывает сбой мое приложение - NSMutableArray * mutToolbarItems = [NSMutableArray arrayWithArray: self.toolbarItems]; – Tony

+0

Вы делаете это, прежде чем вы установите 'self.toolbarItems'? Если это так, это может привести к его сбою. В противном случае я предполагаю, что вы перевыпускаете «self.toolbarItems» где-то. Вы когда-нибудь отправляете его «релиз»? (Вы не должны, так как всякий раз, когда вы его устанавливаете, он автоматически выдает старое значение.) – shosti