didSelect 调用时如何切换自定义 xib 单元格?

How to switch custom xib cell when didSelect call?

我有一个带有 2 个自定义 xib 单元格的 tableView。我想在用户点击时切换自定义单元格,同时调整单元格高度。我如何实现它?我尝试使用容器视图,但高度将相同。我想知道是否可以为 tableView 单元格使用两个 xib?谢谢。

var isContactView: Bool = true

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
    tableView.register(UINib(nibName: "ContactTableViewCell", bundle: nil), forCellReuseIdentifier: "contactCell")
    tableView.register(UINib(nibName: "DetailTableViewCell", bundle: nil), forCellReuseIdentifier: "detailCell")
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    //if ContactTableViewCell return 40
    //if DetailTableViewCell return 150
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    //by default the cell view is ContactTableViewCell. 
    //When user tapped the cell it will change to DetailTableViewCell.
    if isContactView {
        let cell = tableView.dequeueReusableCell(withIdentifier: "contactCell", for: indexPath) as! ContactTableViewCell
        //do something...
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "detailCell", for: indexPath) as! DetailTableViewCell
        //do something...
    }

    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //not sure how to change the xib in here.
    
    //if cell view is ContactTableViewCell 
        cell view = tableView.dequeueReusableCell(withIdentifier: "detailCell", for: indexPath) as! DetailTableViewCell
        isContactView = false
        tableView.reloadData()
    
    //else 
        cell view = tableView.dequeueReusableCell(withIdentifier: "contactCell", for: indexPath) as! ContactTableViewCell
        isContactView = true
        tableView.reloadData()
}

有2个案例:

  1. 如果只有单个单元格需要查看,则在didSelect中放入如下代码即可:

isContactView = !isContactView

tableView.reloadData()

  1. 如果有多个要应用条件的单元格。请在您的数据模型中输入密钥。

例如:

testArr 是您在表视图中显示的对象数组。然后保留一个键,比如这个模型中的 isContactView。并根据此密钥进行登录。

就像 cellForRow:

if testArr[indexpath.row].isContactView {
        let cell = tableView.dequeueReusableCell(withIdentifier: "contactCell", for: indexPath) as! ContactTableViewCell
        //do something...
} else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "detailCell", for: indexPath) as! DetailTableViewCell
        //do something...
}

并在选择中:

isContactView = !testArr[indexPath.row].isContactView