Swift 3 button.addTarget不能处理所有表格单元格

时间:2017-07-07 12:51:32

标签: ios swift swift3

我创建了一个应用,允许用户根据评论存储各种录音。当我显示这个表时,数据填充了以下代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let row = (indexPath as NSIndexPath).item
    let cell = tableView.dequeueReusableCell(withIdentifier: "voiceRecordingCell", for: indexPath) as! VoiceRecordingTableViewCell
    let voiceRecording = self.voiceRecordings[row] as! NSDictionary

    let isoFormatter = DateFormatter()
    isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'.000Z'"
    let createdAt = isoFormatter.date(from: voiceRecording["created_at"] as! String)
    self.recordingIndexPaths.insert(indexPath, at: row)

    cell.recording = voiceRecording
    cell.date.text = getDateFormatter("dd-MM-y").string(from: createdAt!)
    cell.time.text = getDateFormatter("HH:mm").string(from: createdAt!)
    cell.length.text = voiceRecording["length"] as? String
    cell.location.text = voiceRecording["location"] as? String

    let audioPlayerController = self.storyboard?.instantiateViewController(withIdentifier: "AudioPlayerController") as! AudioPlayerController

    audioPlayerController.voiceRecording = voiceRecording

    cell.audioPlayer.addSubview(audioPlayerController.view)
    self.addChildViewController(audioPlayerController)
    audioPlayerController.didMove(toParentViewController: self)

    cell.deleteRecordingButton.tag = row
    cell.deleteRecordingButton.addTarget(self, action: #selector(deleteRecordingPressed(_:)), for: .touchUpInside)

    return cell
}

单元格似乎都正确渲染但是对于最初没有使用页面渲染的单元格,我必须向下滚动才能查看,当我单击音频播放器控件上的按钮或{{ 1}}没有任何反应,就好像deleteRecordingButton没有被设置一样。设置按钮的代码正在被调用,并且不会产生错误,它只是不适用于那些按钮。

最初显示在屏幕上的按钮具有正确的操作,并且完全正常工作,所以我知道它有效。

我真的不知道造成这种情况的原因。我确实尝试搜索谷歌和stackoverflow但我没有找到任何东西。对此的任何帮助都将受到极大的欢迎。

---------------更新-----------

我只是尝试在

中添加一些断点
addTarget

这也只能在前2个单元格中调用,如果在横向上则调用最高单元格!

2 个答案:

答案 0 :(得分:1)

由于单元格一直被重用,引用会丢失。 尝试这样的事情:

import random

# create list of random numbers and manually insert two peaks
t = [random.randrange(1, 1000) for r in range(29400)]  # found this here: https://stackoverflow.com/questions/16655089/python-random-numbers-into-a-list
t[666] = 2000
t[6666] = 2000

# finds the peak elements
peaks = [index for index, value in enumerate(t) if value == max(t[max(index-2000, 0):min(index+2000, len(t))])]
print peaks  # includes 666 and 6666

另一个tipp。永远不要在cellForRowAtIndexPath中初始化class ButtonTableViewCell: UITableViewCell { typealias TapClosure = () -> Void var buttonTapped: TapClosure? @IBAction func buttonTouchUpInside(sender: UIButton) { buttonTapped?() } } extension TestViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) as! ButtonTableViewCell cell.buttonTapped = { print("Button tapped") } return cell } } 。而是在viewDidLoad或静态结构中创建它以供重用。

答案 1 :(得分:0)

最后我想出来了......

这种情况正在发生,因为我使用滚动视图来上下滚动表而不使用表本机滚动功能。

使用表格滚动功能时,按钮会在动作进入视图时应用。这由func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {方法处理。然而,当你按照我的方式进行时,它最初呈现所有单元格和屏幕外的单元格不起作用!

以这种方式工作有点烦人,但至少我现在知道了。