У меня есть 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?
}
Благодарим за отзыв. Я понял. Вместо того, чтобы устанавливать переменную indexPath в 'playMP3', я добавил переменную для кнопки в класс и установил ее в' playMP3'. – Adrian