【问题标题】:Hide or Show Static TableViewController Cells with a Segmented Control使用分段控件隐藏或显示静态 TableViewController 单元格
【发布时间】:2018-12-14 21:52:43
【问题描述】:

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

代码:

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)

}

为什么切换时tableview没有重新加载?除了将大小更改为 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 将在我第一次选择新的段索引时更改单元格,但段控件不会更改并且变得无响应。为什么该部分会以这种方式响应?如果我解决了这个问题,问题就会得到解决。

@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)
}

【问题讨论】:

  • 您使用静态单元格让自己的生活变得困难。使用动态模型会容易得多,并且只显示您需要的单元格
  • 我正在使用仅适用于静态单元格的容器视图。
  • 您可以设法在表格视图中使用容器视图。参见例如stackoverflow.com/a/38673948/1852207。但是你真的需要一个容器还是只需要一个可重复使用的电池?后者更容易、更轻量

标签: ios swift uitableview uisegmentedcontrol


【解决方案1】:

比较细胞是个问题

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

您需要检查索引路径

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

【讨论】:

  • 这不起作用。当我更改分段时没有任何反应。
  • 您是否在段操作中重新加载表格?
  • 是的。只有在重新加载的 seg 操作中使用 self.cell.isHidden 才能让表做出反应。它会隐藏单元格,然后不会切换回或显示段上的开关,就好像它被冻结了一样。我没有收到任何错误。
【解决方案2】:

我最终更新的解决方案是在类的顶部创建var selectedSegment = 0

然后添加:

@objc func segChange(sender: UISegmentedControl) {

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

   tableView.reloadData()

}

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

【讨论】:

    【解决方案3】:

    我建议你重新加载表格视图并将section中的行数设置为0

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

    并在您将目标添加到您的 segmentedControl 以更改您的标志并重新加载表格视图。

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

    【讨论】:

    • 它们在同一节中,以分段控件作为标题
    • 这就是为什么我们只将行设置为 0 而不是部分所以不用担心这对你有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2020-05-25
    • 2011-03-18
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多