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值,怎么办

UISearchBar 的按钮标签问题

IndexPath.row 多个部分的错误值

_tableView reloadData 使我的应用程序崩溃

使用控件的Tag属性传递信息

Django 抛出“[123L, 123L] is not JSON serializable”