2015-10-22 2 views
0

У меня есть UITableViewController с кучей пользовательских ячеек, в которых есть playButton. В cellForRowAtIndexPath я назначаю тег, который равен indexPath кнопки, так что, когда нажата кнопка playButton, я устанавливаю заголовок кнопки на «Стоп». Он меняется на «Стоп», как и должно быть, и когда я нажимаю «Стоп», он возвращается к «Воспроизвести».Обновление пользовательской ячейки UIButton title при публикации NSNotification

Где я испытываю трудности, когда мой звук перестает играть сам по себе, без вмешательства пользователя. Я установил наблюдателя, чтобы прослушать MP3-плеер. Я добавил наблюдатель в viewDidLoad из MyTableViewController:

Ниже приведена переменные использовать для облегчения замены названия playButton в моих клетках:

// Variables to facilitate changing playButton title 
var indexPathOfPlayButton = Int() 
var isPlaying: Bool = false 

В viewDidLoad из MyTableViewController, я добавляю этот наблюдатель:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "resetPlayButton", name: resetPlayButtonNotification, object: nil) 

Вот мой playMP3 метод на MyTableViewController:

func playMP3(sender: AnyObject) { 

    if isPlaying == false { 
     isPlaying = true 
     // This gets the indexPath of the button that sent the playMP3 request 
     let indexPath = sender.tag 
     sender.setTitle("Stop", forState: UIControlState.Normal) 

     // This sets the indexPath of the playButton that we'll redraw the button when it receives a notification? 
     indexPathOfPlayButton = indexPath 

     if resultsSearchController.active { 
      let soundToPlay = self.filteredSounds[indexPath] 
      let soundFilename = soundToPlay.soundFilename as String 
      mp3Player = MP3Player(fileName: soundFilename) 
      mp3Player.play() 
     } else { 
      let soundToPlay = self.unfilteredSounds[indexPath] 
      let soundFilename = soundToPlay.soundFilename as String 
      mp3Player = MP3Player(fileName: soundFilename) 
      mp3Player.play() 
     } 
    } 

    else if isPlaying == true { 
     isPlaying = false 
     sender.setTitle("Play", forState: UIControlState.Normal) 
     mp3Player.stop() 
    } 
} 

В моем MP3Player классе, это метод делегата я использую опубликовать уведомление, что это делается:

func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) { 
    if currentTrackIndex == tracks.count - 1 { 
     print("end of playlist reached") 
     player.stop() 
     NSNotificationCenter.defaultCenter().postNotificationName(resetPlayButtonNotification, object: self) 
    } 

    else if flag == true { 
     print("advance to next track") 
     nextSong(true) 
    } 
} 

Наконец, этот метод на MyTableViewController, который вызывается, когда уведомление опубликовано:

func resetPlayButton() { 
    print("resetPlayButtonCalled") 
    // TODO: How do I get a hold of the button and change the title from outside playMP3? 
} 

ответ

0

Тайна решена! Я устанавливал indexPath отправителя как Int. Вместо этого, я объявил этот класс переменную:

// I removed this--> var indexPathOfPlayButton = Int() 
var clickedButton = UIButton() // this gets set in playMP3 

В playMP3, я добавил заявление и вынул один, где я установить переменную indexPath:

let indexPath = sender.tag // The tag which button was pressed (it's set to its indexPath when it's drawn in cellForRowAtIndexPath) 
    // Nuked this--> indexPathOfPlayButton = indexPath 
    // and replaced with this 
    clickedButton = sender as! UIButton 

Тогда в моем resetPlayButton методе, я хватаю, что переменную и изменить заголовок на «Воспроизвести»

func resetPlayButton() { 
    print("resetPlayButtonCalled") 
    clickedButton.setTitle("Play", forState: UIControlState.Normal) 
} 
0

У вас есть много кода, который не связан с проблемой, о которой вы говорили выше. Если я понял, ваша проблема в том, что вы не знаете, как обновить кнопку в своем селекторе наблюдателей resetPlayButton(). Кнопка находится в ячейке tableview, и вы сохранили индекс в indexPathOfPlayButton. Вы можете получить клетку, как:

let cell: YourCellClass = tableView.cellForIndexPath(NSIndexPath(forItem: indexPathOfPlayButton, inSection: 0)) 

И после того, как вы получите клетку, вы можете обновить свой вывод.

Другой способ заключается в вызове reloadData()

+0

Благодарим за отзыв. Я понял. Вместо того, чтобы устанавливать переменную indexPath в 'playMP3', я добавил переменную для кнопки в класс и установил ее в' playMP3'. – Adrian

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