使用分段控件隐藏或显示静态 TableViewController 单元格

Hide or Show Static TableViewController Cells with a Segmented Control

我正在尝试使用分段控件和开关隐藏或显示 tableviewcontroller 单元格。下面的代码不起作用,只有当我触摸单元格内部时它才会打印。我相信触摸会导致 table 重新加载。

代码:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let cell = super.tableView(tableView, cellForRowAt: indexPath)

    switch(profileSegment.selectedSegmentIndex) {

    case 0:
        print("Seg Change")
        if cell == self.reviewsCell {
            return 0
        }
        tableView.reload()
        break

    case 1:
        print("Seg Change")
        if cell == self.watchCell {
            return 0
        }
        if cell == self.watchedCell {
            return 0
        }
        if cell == self.reviewsCell {
            return 500
        }
        tableView.reload()
        break

    default:
        break

    }

    return super.tableView(tableView, heightForRowAt: indexPath)

}

为什么 table 视图在切换时没有重新加载?除了将大小更改为 0 之外,还有更有效的方法吗?

更新:

我尝试了另一条路线并取得了部分成功。该开关有效,但只会使单元格显示为空白。什么会使细胞完全消失?

代码:

func segChange(sender: UISegmentedControl) {

switch(profileSegment.selectedSegmentIndex) {

    case 0:
        self.reviewCell.isHidden = true
        self.cell.isHidden = false
        tableView.reloadData()

        break

    case 1:
        self.reviewCell.isHidden = false
        self.cell.isHidden = true
        tableView.reloadData()

        break

    default:
        break

    }

}

更新 2:如果我使用下面的代码,tableView 将在我第一次 select 新的段索引时更改单元格,但段控件不会更改并且变得无响应。为什么细分市场会这样回应?如果我解决这个问题就会解决。

@objc func segChange() {

   tableView.reloadData()

}

override func viewDidLoad() {
    super.viewDidLoad()

profileSegment.addTarget(self, action: #selector(segChange), for: .valueChanged)


}


override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let cell = super.tableView(tableView, cellForRowAt: indexPath)

    switch(profileSegment.selectedSegmentIndex) {

    case 0:
        if cell == self.reviewsCell {
            return 0
        }
        break

    case 1:
        if cell == self.watchCell {
            return 0
        }
        if cell == self.watchedCell {
            return 0
        }
        if cell == self.reviewsCell {
            return 500
        }
        break

    default:
        break

    }

    return super.tableView(tableView, heightForRowAt: indexPath)
}

比较细胞是问题所在

 if cell == self.reviewsCell { // it's wrong to keep cells ( like reviewsCell  ) as vars 

您需要检查索引路径

 if indexPath.row == 3 {   // hide cell at indexPath 3

我建议您重新加载 table 视图并将部分中的行数设置为 0

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// if profileSegment.selectedSegmentIndex {
//  return 0 for this cell 
// }
// else {
//   return cell Height 
// }
}

并在将目标添加到 segmentedControl 中更改标志并重新加载 table 视图。

self.segmentedControl.addTarget(self, action: #selector(segmentedValueChanged), for: .valueChanged)

我最后一次更新的解决方案是在 class 的顶部创建 var selectedSegment = 0

然后添加:

@objc func segChange(sender: UISegmentedControl) {

    self.selectedSegment = sender.selectedSegmentIndex //Add this line of code

   tableView.reloadData()

}

这会告诉分段控件更新其选定的索引。这导致我更改索引时没有响应。