如何在点击另一个单元格后操纵UITableViewCell? - 斯威夫特

时间:2016-08-24 07:51:27

标签: ios swift uitableview

如何在点击另一个单元格后操纵UITableViewCell

我有3个单元格,每个单元格UIPickerView第一个单元格userInteractionEnabledtrue但第二个和第三个单元格为false ..当用户点按时第一个单元格其余单元格userInteractionEnabled应为true

我知道我需要使用userInteractionEnabled但是怎么样?我应该在变量中保存单元格然后在需要时进行操作吗?

3 个答案:

答案 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
}