启用/禁用表格视图单元格 - 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
有两个部分:row
和 section
。您需要检查您的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 Array
和 TableView
加载,则在对象中添加一个名为 isEnabled 的额外属性。
其他
如下创建Array
var cellStateArray = Array(repeating: true, count: numberOfRows)
然后您何时切换复选框,具体取决于将所需单元格索引的标志(当前为您的第 4 行)切换为 false
或 true
in cellStateArray
并在cellForRowAt
方法中检查cellStateArray
中的标志以获取相应的cell index
并设置 userInteractionEnabled 启用/禁用(如果需要,可以进行额外配置)
然后简单地重新加载单元格/表格
【讨论】:
好的,但假设单元格启用/禁用状态确定它呈现在屏幕上。在这种情况下,您的解决方案无济于事。数据还在。所以只有他能做的就是将大小更改为 0,这不会从层次结构中删除视图。然而。我的解决方案允许这样做。 我不认为只是重新加载单元格将有助于更新单元格的状态以上是关于启用/禁用表格视图单元格 - iOS - Swift的主要内容,如果未能解决你的问题,请参考以下文章