2012-06-15 3 views
1

Я создаю приложение с iPod-подобными элементами управления (воспроизведение, пауза и т. Д.). Приложение имеет tableView с именами дорожек в каждой ячейке. У меня есть MainViewController с UITableView и обычным классом UITableViewCell. Элементы управления проигрывателем находятся в MainViewController.Наблюдатель NSNotification в пользовательском UITableViewCell?

У меня также есть кнопка воспроизведения/паузы в каждой ячейке. Я успешно настроил NSNotifications, чтобы опубликовать уведомление, когда кнопка воспроизведения нажата в ячейке, поэтому информация о дорожке отправляется методу наблюдателя и респондента в MainViewController, и инициируются элементы управления проигрывателем (управляемые MPMoviePlayerController).

Это работает, но как только трек играет, я не могу понять, как сделать кнопку воспроизведения/паузы в ячейке «зеркальным отображением» кнопки воспроизведения/паузы в элементах управления iPod. Я не думаю, что добавление NSNotification observer в каждую ячейку - правильный способ сделать это.

Дополнительная информация: Изображение кнопки воспроизведения/паузы в проигрывателе MainViewController определяется методом, который срабатывает каждую половину секунды и проверяет playbackstateMPMoviePlayerController. Если вы играете, кнопка воспроизведения проигрывателя воспроизводится. Если он приостановлен, он устанавливает изображение паузы. Я думаю, что реализация также установит, что кнопка play/pause tableCell будет здесь.

Редактировать Этот метод вызывается всякий раз, когда состояние воспроизведения изменяется (через NSNotification) в моем UITableViewController. (playButton - кнопка воспроизведения/паузы в элементах управления плеером, а не воспроизведение/пауза в ячейке таблицы, в которой я пытаюсь выполнить обновление в соответствии с состоянием воспроизведения).

- (void) updateViewForPlayerState 
{ 
// Change playButton image depending on playback state 
[playButton setImage:((moviePlayer.playbackState == MPMoviePlaybackStatePlaying) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal]; 

} 

ответ

0

Использование [tableView reloadData], когда ваше состояние изменилось и обеспечивая ячейка в cellForRowAtIndexPath: установите кнопку в соответствии с состоянием ваших данных (т. е. играет ли песня, на которую ссылается ячейка).

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

+0

Стоит ли переписывать 'reloadData' каждый раз при изменении состояния воспроизведения? – mnort9

+0

'reloadData' только перезагружает данные для видимых ячеек. Таким образом, этот подход эффективен. – mnort9

1

Прекрасный пример того, что вы пытаетесь сделать, доступен на сайте разработки Apple.

TableViewSuite

Проект в вопросе называется CustomTableViewCell. В этом проекте используется таймер для периодического обновления ячеек, который по вашему описанию звучит так, как будто вы делаете что-то подобное.

При изменении состояния ячейки выполните следующее.

  1. Обновить состояние ячейки. Я предполагаю, что это отражено в plabackstate
  2. вызова [ячейка setNeedsDisplay]

Это должно заставить пользовательскую ячейку, чтобы перерисовать себя с новым состоянием, которые вы установили.

Это будет в вашем контроллере представления таблицы в методе таймера обратного вызова

NSArray *visibleCells = self.tableView.visibleCells; 
    for (CustomCell *cell in visibleCells) { 
     [cell redisplay]; 
} 

Это будет в пользовательском табличного ячейку

- (void)redisplay { 
    [customCellView setNeedsDisplay]; 
} 
+0

Я не совсем понимаю ваше решение. Используя 'setNeedsDisplay', мне нужно иметь метод' drawRect' в моей пользовательской ячейке? Я добавил код на свой вопрос. – mnort9

+0

С вашим решением, где бы я изменил изображение кнопки воспроизведения/паузы ячейки? – mnort9

+0

@mnort Я предположил, что у вас есть пользовательская ячейка в вашем решении, использующее drawRect. Как вы распределяете ячейку? – Shane

Смежные вопросы