如何快速保持自定义单元格中记录/记录停止按钮的行为一致?

时间:2019-05-29 03:28:51

标签: swift uitableview

我在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 个答案:

答案 0 :(得分:1)

我建议引入一个新变量 var isRecording = false在您的StoryItem中,并在单击开始/停止记录按钮时更改其值,然后重新加载该特定单元格。 在您的cellForRowAt中使用

 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
}