如何在点击另一个单元格后操纵UITableViewCell
?
我有3个单元格,每个单元格UIPickerView
第一个单元格userInteractionEnabled
为true
但第二个和第三个单元格为false
..当用户点按时第一个单元格其余单元格userInteractionEnabled
应为true
我知道我需要使用userInteractionEnabled
但是怎么样?我应该在变量中保存单元格然后在需要时进行操作吗?
答案 0 :(得分:3)
我已阅读上述解决方案并且当然都是有效的,但我更喜欢这样的解决方案:我想你有一个要显示的对象数组(忽略你正在使用的模式)。
class MyObject: NSObject {
var selected: Bool = false
}
class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var objects: [MyObject] = []
override func viewDidLoad() {
super.viewDidLoad()
// init your objects:
// 1stObj.enabled = true
// 2ndObj.enabled = false
// 3rdObj.enabled = false
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let obj = self.objects[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.userInteractionEnabled = obj.enabled
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
for obj in self.objects {
obj.selected = !obj.selected
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
tableView.reloadData()
}
}
我认为这个解决方案更具可扩展性和可维护性,但这是我的选择。
对于操作'cellForRowAtIndexPath'函数之外的单元格,您可以这样做:
func manuallyModifyCell(atIndex index: Int, backgroundColor: UIColor = .clearColor()) {
let indexPath = NSIndexPath(forRow: index, inSection: 0)
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
cell.backgroundColor = backgroundColor
}
}
答案 1 :(得分:0)
使用变量跟踪userInteractionEnabled
var selectable: Bool = false
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = sections[indexPath.row]
if selectable {
cell.isUserInteractionEnabled = true
} else {
if indexPath.row != 0 { // Only first cell is enabled
cell.isUserInteractionEnabled = false
}
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(indexPath.row)
if indexPath.row == 0 {
selectable = true
tableView.reloadData()
}
}
答案 2 :(得分:0)
您可以创建一个变量来保留第一个项目的选择状态:
var didSelectFirst = false
然后,在tableView(_:didSelectRowAtIndexPath:)
中,您可以告诉tableview完全重新加载,或者只是重新加载要重新加载的两行。
if indexPath.row == 0 {
didSelectFirst = true
// reload all
tableView.reloadData()
// reload some
tableView.reloadRowsAtIndexPaths([
NSIndexPath(forRow: 1, inSection: 0),
NSIndexPath(forRow: 2, inSection: 0)], withRowAnimation: .Automatic)
}
在tableView(cellForRowAtIndexPath:)
中,您可以使用didSelectFirst
变量更改userInteractionEnabled
if indexPath.row == 1 || indexPath.row == 2 {
cell.userInteractionEnabled = didSelectFirst
}