在按钮功能Swift中访问indexPath.row [重复]

Posted

技术标签:

【中文标题】在按钮功能Swift中访问indexPath.row [重复]【英文标题】:Access indexPath.row in button function Swift [duplicate] 【发布时间】:2018-07-17 12:52:55 【问题描述】:

我正在尝试使用按钮删除选定的行。因此我需要 indexPath.row,我将值写入全局变量,但是当我在按钮中访问它时,它返回 nil 给我。

var selectedRow = ""

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let selectedEvent = myConversationRows[indexPath.row]
    selectedRow = selectedEvent.id!


@IBAction func cancelConversation(_ sender: Any) 

    print("selected")
    print(self.selectedRow)

我猜当我点击按钮时 didSelectRowAt 没有被触发。我尝试了不同的方法,但都没有奏效。

【问题讨论】:

首先需要选择一行,第二个selectedEvent.id可能为nil 制作一个自定义 UITableViewCell,在该单元格中从您的数组中有一个模型对象,在 UITableViewCell 内的 IBAction 中,获取 id 并使用协议调用控制器。在控制器的协议覆盖中,从数组中移除 id 并重新加载 tableView。 这绝对应该是自定义单元格,所以在 cellForRowAt 中将目标添加到按钮。如果您有兴趣,我可以详细说明并为您编写解决方案。 【参考方案1】:

不要使用全局变量!!!

她是解决这个问题的简单方法:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "YOURE_CELL_ID", for: indexPath) as? YOUT_CELL_CLASS 
        cell.youreButton.tag = indexPath.row
    

和:

@IBAction func cancelConversation(_ sender: Any) 
    if let btn = sender as? UIButton 
        let row = btn.tag
        tableView.deleteRows(at: [IndexPath(row: row, section: 0)], with: .bottom)
    

为什么不使用 ios 的删除滑动手势?

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
    if editingStyle == .delete 
        print("Deleted")


        self.tableView.deleteRows(at: [indexPath], with: .automatic)
    

【讨论】:

这实际上是一个不好的方法。删除一行后,其下方行中的标签将关闭 1。查看重复答案以了解如何为按钮获取正确的 indexPath。【参考方案2】:

您应该将selectedRow 声明为Int,并为其分配默认值-1,意思是“未设置”。然后,在tableView(_:didSelectRowAt:) 中输入这一行:

selectedRow = indexPath.row

cancelConversation() 中输入:

if selectedRow != -1 
    //...

【讨论】:

selectedRow 返回 -1 这表明tableView(_:didSelectRowAt:) 从未被调用过。您是否正确连接了 tableview 代表插座? didSelectRow 如果他的按钮有 userInteractionEnabled 将不起作用;)因此我最初的想法是将目标连接到按钮,以便只有按钮会响应点击,而不是整个行。

以上是关于在按钮功能Swift中访问indexPath.row [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何通过按导航栏按钮访问标签栏项目

使用 moveRow(at:,to:) 时如何更改 UITableViewCell 的不透明度和颜色

如何从目标函数集(Swift 3)访问 UICollectionView 中的按钮

添加到收藏夹功能 [swift]

加载动画仅在按钮功能后显示(Swift)

Swift 3:如何在表格视图的多个部分中使用操作按钮?