Tableview button.tag 抛出 lldb
Posted
技术标签:
【中文标题】Tableview button.tag 抛出 lldb【英文标题】:Tableview button.tag throw lldb 【发布时间】:2017-07-28 05:19:09 【问题描述】:我不知道会发生什么,我将button.tag
设置为表格行,当它到达行> 1 时,它会抛出 lldb。如果button.tag <= 1
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cells")! as UITableViewCell
let alertBtn = cell.viewWithTag(1) as! UIButton;
alertBtn.tag = indexPath.row
alertBtn.addTarget(self, action: Selector(("showAlert:")), for: UIControlEvents.touchUpInside)
return cell
【问题讨论】:
它在哪里抛出错误。你能告诉我们showAlert的实现吗? 错误来自我设置按钮标签时,即使我删除了添加目标,它也会继续抛出相同的错误。它与添加目标无关 你想在 let alertBtn = cell.viewWithTag(1) as 中做什么!用户界面按钮;线。在这里,您是说带有标签 1 的视图是您的按钮,然后您再次想要更改标签,因此在重用状态下,您的标签会发生变化,并且可能导致崩溃的原因是这一行。为什么要从带有标签的视图中获取按钮。 你在哪里添加了`alertBtn`? 你能展示你的自定义cell swift文件吗 【参考方案1】:应用程序在这一行崩溃,因为它无法找到标签为 1 的视图,标签正在更新每个单元格中的行值。
let alertBtn = cell.viewWithTag(1) as! UIButton
删除这一行并从 UITableViewCell 获取 @IBOutlet for alertBtn 而不是使用标签刷新。
【讨论】:
【参考方案2】:Swift 3X...
您正在替换您的标签,因此第一个标签项目将为零,因此请替换此代码...
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cells")! as UITableViewCell
let alertBtn = cell.viewWithTag(1) as! UIButton
alertBtn.addTarget(self, action: #selcetor(showAlert(sender:))), for: .touchUpInside)
return cell
func showAlert(sender:UIButton)
let point = sender.convert(CGPoint.zero, to: self.tableview)
let indexpath = self.tableview.indexPathForRow(at: point)
【讨论】:
谢谢它的工作!!!,但是现在的添加目标应该是这样的。 alertBtn.addTarget(self, action: #selector(showAlert(sender:)), for: .touchUpInside)【参考方案3】:尝试自定义UITableViewCell
。
为您的新类声明协议和委托。连接一个动作并调用委托
protocol MyCellDelegate: class
func buttonPressed(for cell: MyCell)
class MyCell:UITableViewCell
weak var delegate: MyCellDelegate?
@IBAction func buttonPressed(sender: Any)
self.delegate?.buttonPressed(for: self)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
.......
cell.delegate = self
........
记得将新的协议实现添加到您的 VC。您可以添加prepareForReuse
方法并在重用单元格时将委托重置为零。
【讨论】:
【参考方案4】:如果您想获取包含点击按钮的单元格的 indexPath,您可以使用与您的要求类似的功能。
func showAlert(sender: AnyObject)
if let cell = sender.superview?.superview as? UITableViewCell // do check your viewchierarchy in your case
let indexPath = itemTable.indexPath(for: cell)
print(indexPath)// you can use this indexpath to get index of tapped button
从 cellForRowAtIndexPath alertBtn.tag = indexPath.row
中删除这一行
如果您可以为此目的使用自定义单元格,则可以像以前一样获取所选按钮的索引路径。
为您的按钮和标签等创建 CustomCell 并创建 IBOutlet。您可以在 cellForRowAtIndexPath 中访问您的单元格的子视图并将标签分配给您的按钮。如果您对 CustomCell 有任何疑问,请告诉我。
【讨论】:
以上是关于Tableview button.tag 抛出 lldb的主要内容,如果未能解决你的问题,请参考以下文章
c# 如果已经给每个按钮的tag属性赋值了,想在运行时,点击各个按钮,都想得到每个按钮对应的tag值,怎么办