Как сохранить постоянство поведения кнопки записи / остановки записи в пользовательской ячейке в быстром? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть кнопка записи в пользовательской ячейке в UITableView с двумя изображениями - когда вы нажимаете кнопку, она показывает изображение для «остановки» записи, а когда вы останавливаете запись, она показывает вам изображение для «записи». Однако, когда я нажимаю кнопку записи, изображение остановки изменяется на другой строке в виде таблицы, а не на кнопке ячейки, которую я только что нажал.

Я попытался согласовать поведение кнопки, используя метод протокола делегата для настройки пользовательской ячейки. Но это не решило проблему.

Код для пользовательской ячейки (CreateStoryCell) выглядит следующим образом:

import UIKit


protocol createStoryCellDelegate {
func didRecord(sender: UIButton, storyItem: StoryItem)
}

class CreateStoryCell: UITableViewCell {


@IBOutlet weak var storyCellBackground: UIView!


@IBOutlet weak var storyTextLabel: UILabel!


@IBOutlet weak var record: UIButton!

var storyItem : StoryItem!
var delegate: createStoryCellDelegate?

func setStoryItem(storyPart: StoryItem) {
    storyItem = storyPart
    storyTextLabel.text = storyItem.text

}

@IBAction func recordTapped(_ sender: UIButton) {

    delegate?.didRecord(sender: sender, storyItem: storyItem)
}

}

Расширение для настройки ячейки для tableView находится здесь:

extension CreateStoryViewController : UITableViewDataSource {


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "createStoryCell", for: indexPath) as! CreateStoryCell

        let storyItem = storyText?[indexPath.row]

        cell.setStoryItem(storyPart: storyItem!)        

        cell.delegate = self

    return cell
}


}

А метод didRecord находится здесь:

extension CreateStoryViewController : createStoryCellDelegate {

func didRecord(sender: UIButton, storyItem: StoryItem) {

    if recordToggle == 1 {

        sender.setImage(UIImage(named: "recordStop"), for: .normal)

      checkRecording(storyItem: storyItem)

      audioRecorder.record()

        recordToggle = 2


    } else {

        sender.setImage(UIImage(named: "smallMicBtn"), for: .normal)

        audioRecorder.stop()

        recordToggle = 1


    }

}

}

Обратите также внимание, что вышеуказанный метод делегата начинает работать до тех пор, пока я не вставлю функциональность записи, т. Е. Как только я активирую строки audioRecorder.record () и audioRecorder.stop (), поведение кнопки становится противоречивым, как описано выше.

Ранее я пытался реализовать это путем преобразования позиции кнопки записи в indexPath с помощью следующего:

//        let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to: self.createStoryTableView)
//        let indexPath = self.createStoryTableView.indexPathForRow(at: buttonPosition)
//        let storyItem = self.storyText?[indexPath?.row ?? 0]

Но у меня такое же поведение.

Буду благодарен за любые предложения о том, как решить. Спасибо.

1 Ответ

1 голос
/ 06 июня 2019

Я рекомендую ввести новую переменную var isRecording = false в свой StoryItem и изменить ее значение при нажатии кнопки начала / остановки записи и перезагрузить эту конкретную ячейку.В твоем cellForRow используйте это

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
 let storyItem = self.storyText?[indexPath?.row ?? 0] 
 let image = (storyItem. isRecording == true) ? (UIImage(named:"stopImage")) : (UIImage(named: "startImage")) 
 cell.record.setImage(image, for: .normal) 
 return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...