Изменить (не инициализировать) идентификатор UIBarButtonItem программно?

В IB я могу установить идентификатор UIBarButtonItem в "play", который добавляет изображение кнопки воспроизведения (треугольник, указывающий вправо).

Есть ли способ изменить это изображение программно? Я хочу изменить его на "пауза" при нажатии кнопки воспроизведения.

Я знаю, что вы можете инициализировать UIBarButtonItem с идентификатором, но мне еще предстоит найти способ изменить его после инициализации. Это вообще возможно?

Единственное, о чем я могу думать, это удалить старую кнопку и инициализировать новую вместо нее, но это вряд ли кажется эффективным.

Какие-нибудь мысли?

Ответ 1

Хорошо, я догадался до этого вопроса и наткнулся на пример кода из Apple, где они делают точно то же самое (переключить воспроизведение/паузу кнопки на панели инструментов). Но вместо использования встроенных идентификаторов воспроизведения и паузы UIBarButtonItem они используют пользовательский UIButton и переключают пользовательские изображения.

Итак, если Apple не справляется с проблемой создания и переключения пользовательских изображений на UIButton вместо встроенных кнопок воспроизведения и паузы UIBarButtonItem, то я думаю, что довольно безопасно сказать, что нет возможности программно изменить идентификатор UIBarButtonItem.

Это то, что они (Apple) делают для переключения изображений при нажатии кнопки:

// Call this when the button you want to toggle is pressed:
[playButton setImage:((p.playing == YES) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal];

Замените p.playing любым BOOL, которым вы хотите удерживать состояние вашей кнопки. playButton является пользовательским UIButton на панели инструментов. pauseBtnBG и playBtnBG - это изображения для переключения.

Ответ 2

Это работает довольно хорошо:

UIBarButtonItem *oldButton = [myToolBar.items objectAtIndex:1];
[myToolBar setItems:[NSArray arrayWithObjects:[myToolBar objectAtIndex:0], [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop target:self action:@selector(tapStopRefreshButton:)],nil] animated:NO];
[oldButton release];

В этом примере у меня была панель инструментов для UIWebView, и когда кто-то нажал кнопку "Обновить", я хотел, чтобы она изменилась на "Стоп". На панели инструментов было только гибкое пространство и одна кнопка на нем - чтобы выровнять по правому краю кнопку - так что я взял ссылку на старую кнопку, сделал новую с тем же селектором, что и старые, reset кнопки на и затем отпустили исходную кнопку.

Не самый красивый, но вы можете использовать все стандартные кнопки без необходимости переопределять класс кнопки.

Ответ 3

Как насчет двух сложенных панелей инструментов? Тогда вы можете иметь некоторые системные кнопки в верхней, а другие - в нижней. Если нажата кнопка воспроизведения, просто скройте верхнюю панель инструментов.