2012-06-15 84 views
1

我正在構建一個類似iPod的控件(播放,暫停等)的應用程序。該應用程序在每個單元格中都有帶有軌道名稱的tableView。我有一個MainViewControllerUITableView和一個自定義UITableViewCell類。播放器控件存在於MainViewController中。定製UITableViewCell中的NSNotification觀察者?

我在每個單元格中還有一個播放/暫停按鈕。我已成功設置NSNotifications以在單元格中按下播放按鈕時發佈通知,因此軌道信息將發送給MainViewController中的觀察者和響應方法,並啓動播放器控件(由MPMoviePlayerController驅動)。

這是有效的,但是一旦播放曲目,我無法弄清楚如何使單元格中的播放/暫停按鈕「鏡像」我的iPod控制中播放/暫停按鈕的狀態。我不認爲在每個單元中添加NSNotification observer是正確的做法。

附加信息:MainViewController播放器中的播放/暫停按鈕圖像由每半秒觸發一次的方法確定,並檢查MPMoviePlayerControllerplaybackstate。如果正在播放,則播放器按鈕將設置爲播放圖像。如果暫停,它會設置暫停圖像。我正在考慮執行也設置tableCell播放/暫停按鈕將在這裏。

編輯只要播放狀態在UITableViewController中更改(通過NSNotification),就會調用此方法。 (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

一個很好的例子,你正在嘗試做什麼可在蘋果開發網站上。

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