使用分段控件隐藏或显示静态 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()
}
这会告诉分段控件更新其选定的索引。这导致我更改索引时没有响应。
我正在尝试使用分段控件和开关隐藏或显示 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()
}
这会告诉分段控件更新其选定的索引。这导致我更改索引时没有响应。