启用/禁用表格视图单元格 - iOS - Swift

Posted

技术标签:

【中文标题】启用/禁用表格视图单元格 - iOS - Swift【英文标题】:Enable/Disbale Tableview cell - iOS - Swift 【发布时间】:2018-03-01 01:39:22 【问题描述】:

我有一个表格视图,里面有 4 行。

第 3 行将有一个复选框。我只想在第 3 行复选框被选中时启用第 4 行

所以我有一个复选框(即按钮)和点击该复选框的操作的出口。

我的问题是如何获得对下一个单元格的引用并使其启用/禁用

我试图将该单元格作为参考 myTableView.cellForRow(at: index + 1) 但它会抛出二进制操作数不能应用于 indexPath 的错误。

请建议我如何实现

【问题讨论】:

请发布您的代码,以便我们提供帮助... IndexPath 有两个部分:rowsection。您需要检查您的indexPath.row 是否有效。这是一种可以让您做到这一点的方法。 ***.com/a/40665778/4475605 简单方法——创建4个UITableViewCell实例,放入数组中,在cellForRow中不要调用dequeue方法,只返回对应的cell。 启用/禁用是什么意思 你想在这两种情况下都显示单元格,但在禁用的单元格中,用户应该无法与该单元格交互吗? @ashh 检查下面的新答案 【参考方案1】:

我假设您有自己的自定义 UITableViewCell 类。你的MyTableViewController 是这个tableview 单元格的代表。 每当用户选中/取消选中时,您的框委托会告诉您的控制器,然后您调用 reload 方法来删​​除给定的行。

这是我在我的应用中使用的解决方案。

import Foundation
import UIKit

class MyTableViewController: UITableViewController 
    private struct CurrentSetting 
        var RowAEnabled: Bool = true
        var RowBEnabled: Bool = true
        var RowCEnabled: Bool = true
        var RowDEnabled: Bool = true
        var RowEEnabled: Bool = true
        //...
        //maybe more?
    


    /// Let's say those are your table view rows. Data or whatever.
    fileprivate var settings: [String] 
        //In here you have your static position.
        var configuration = ["Row A","Row B", "Row C"]
        //However, if some data are enabled/disabled you modify it based on settings
        if current.RowAEnabled 
            configuration += ["Row D"]
        
        return configuration
    
    //This is your setting for current tableview
    private var current = CurrentSetting()


//Use this to reload row for your enable/disable cell.
tableView.reloadRows(at: [indexPath], with: .none)

示例如何与我的应用配合使用。 重要提示:为您的表格视图设置它的数据源。项目数。

【讨论】:

我会建议寻找更优化和通用的方式 @HarshalBhavsar 你可以在这里提出建议 在下面添加了新答案,因为它完全不同,无法编辑您的【参考方案2】:

单击复选框假设有一个方法名称checkBoxClicked。 您可以执行以下操作:

@IBAction func checkBoxClicked(_ sender: Any) 
        let button = sender as! UIButton
        let clickedIndex = button.tag

        let nextIndexPath = IndexPath(item: clickedIndex+1, section: 0) // specify section here, if it's sectioned tableview
        let cell = tableView.cellForRow(at: nextIndexPath)

        // enable cell here
        cell?.isUserInteractionEnabled = true    // or reload cell

不要忘记在 cellForRowAtIndexPath 方法中为您的复选框设置标签,例如:

cell.checkBoxButton.tag = indexPath.row

【讨论】:

我从中得到了一个想法..下面的检查对我有用-----------if let secondCell = myTableView.cellForRow(at: IndexPath(row: (index + 1),部分:0))作为? MyCustomCell @Ashh 您正在以硬编码的方式进行操作。这会限制你,如果你必须改变,你必须编写更多的逻辑【参考方案3】:

在该复选框的操作中,您可以执行reloadData 的tableview。 之后就可以在cellForRowAtIndexPath里面查看了

喜欢:

if indexpath.row == 4  
then  
//just my opinion, you can do whatever you want.  
cell.userInteractionEnabled = checkBox.isSelected 

或者你可以在numberOfRowsInSection里面检查,你可以把它从dataSource中删除。

【讨论】:

【参考方案4】:

我会建议优化和健壮的方式。

如果您有 Datasource ArrayTableView 加载,则在对象中添加一个名为 isEnabled 的额外属性。

其他

如下创建Array

var cellStateArray = Array(repeating: true, count: numberOfRows)

然后您何时切换复选框,具体取决于将所需单元格索引的标志(当前为您的第 4 行)切换为 falsetrue in cellStateArray

并在cellForRowAt 方法中检查cellStateArray 中的标志以获取相应的cell index 并设置 userInteractionEnabled 启用/禁用(如果需要,可以进行额外配置)

然后简单地重新加载单元格/表格

【讨论】:

好的,但假设单元格启用/禁用状态确定它呈现在屏幕上。在这种情况下,您的解决方案无济于事。数据还在。所以只有他能做的就是将大小更改为 0,这不会从层次结构中删除视图。然而。我的解决方案允许这样做。 我不认为只是重新加载单元格将有助于更新单元格的状态

以上是关于启用/禁用表格视图单元格 - iOS - Swift的主要内容,如果未能解决你的问题,请参考以下文章

iOS画外音,如何跳过表格视图单元格而不是说“未启用”

当我向下滚动表格视图时,隐藏单元格的复选标记消失了

在编辑模式下禁用表格视图单元格突出显示的颜色?

在某些单元格上禁用UITableView滚动

当我滚动浏览我的表格视图时,活动的表格视图单元格不断被禁用

自定义 UITableview 单元格可访问性无法正常工作