J'ai un bouton d'enregistrement dans une cellule personnalisée dans un UITableView avec deux images - lorsque vous appuyez sur le bouton, il affiche l'image pour "arrêter" l'enregistrement et lorsque vous arrêtez l'enregistrement, il vous montre l'image pour "enregistrer". Cependant, lorsque j'appuie sur le bouton d'enregistrement, l'image d'arrêt change sur une autre ligne du tableau et non sur le bouton de la cellule que je viens d'appuyer.
J'ai essayé de rendre le comportement du bouton cohérent en utilisant une méthode de protocole délégué pour configurer la cellule personnalisée. Mais cela n'a pas résolu le problème.
Le code de la cellule personnalisée (CreateStoryCell) est le suivant :
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)
}
}
L'extension pour la configuration de la cellule pour tableView est ici :
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
}
}
Et la méthode didRecord est ici :
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
}
}
}
Veuillez également noter que la méthode déléguée ci-dessus commence à fonctionner jusqu'à ce que j'insère la fonctionnalité d'enregistrement, c'est-à-dire dès que je rends actives les lignes 'audioRecorder.record()' et 'audioRecorder.stop(), le comportement du bouton devient incohérent comme décrit ci-dessus.
Auparavant, j'ai essayé de mettre en œuvre cela en convertissant la position du bouton d'enregistrement en un indexPath avec les éléments suivants :
// let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to: self.createStoryTableView)
// let indexPath = self.createStoryTableView.indexPathForRow(at: buttonPosition)
// let storyItem = self.storyText?[indexPath?.row ?? 0]
Mais j'ai le même comportement.
Je serais reconnaissant pour toute suggestion sur la façon de résoudre. Merci.
Je recommande d'introduire une nouvelle variable var isRecording = false
dans votre StoryItem et de modifier sa valeur en cliquant sur le bouton démarrer/arrêter l'enregistrement et de recharger cette cellule particulière. Dans votre cellForRowAt utilisez ceci
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
}
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots