我创建了一个应用,允许用户根据评论存储各种录音。当我显示这个表时,数据填充了以下代码:
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个单元格中调用,如果在横向上则调用最高单元格!
答案 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 {
方法处理。然而,当你按照我的方式进行时,它最初呈现所有单元格和屏幕外的单元格不起作用!
以这种方式工作有点烦人,但至少我现在知道了。