我在我的UITableView
中使用自定义单元格作为节标题。在那个单元格中有三个按钮。如果在该部分的单元格中单击了任何按钮,则应仅重新加载该自定义部分单元格,而不是任何行。这可能吗?
我使用以下代码重新加载该单元格:
tableViewHome.reloadSections([1], with: UITableViewRowAnimation.none)
它隐藏了我的部分细胞并扭曲了整个桌子。
更新
我使用UITableView
并使用以下代码:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let cellHeader = tableViewHome.dequeueReusableCell(withIdentifier: "header") as! HeaderTableViewCell
cellHeader.filter1btn.addTarget(self, action: #selector(filterBtnAction(_:)), for: .touchUpInside)
cellHeader.filter2Btn.addTarget(self, action: #selector(filterBtnAction(_:)), for: .touchUpInside)
cellHeader.filter3btn.addTarget(self, action: #selector(filterBtnAction(_:)), for: .touchUpInside)
return cellHeader
}
@IBAction func filterBtnAction(_ sender: UIButton) {
print(sender.tag)
tableViewHome.reloadSections([1], with: UITableViewRowAnimation.none)
}
答案 0 :(得分:4)
我有点不清楚这里发生了什么,但听起来有一些值得解释的UITableView
概念:
UITableView
有自己的单元格概念,实现为UITableViewCell
,它自己的页眉/页脚概念,实现为UITableViewHeaderFooterView
。
根据您的意思,您可以采取一些措施来达到预期的效果:
UITableViewCell
方法:如果你使用UITableViewCell
作为一个部分的第一行来表现得像一个“标题”,你只想重新加载该行而不包括该部分的其余部分,你可以调用yourTableViewInstance.reloadRows(at:with:)
(Apple Documentation)此方法采用IndexPath
s数组和动画样式。您可以传入要重新加载的索引路径。
UITableViewHeaderFooterView
方法:如果你使用了正确的UITableViewHeaderFooterView
,那么你需要确保在重新加载该部分时提供适当的视图。 Zack Shapiro概述了您需要采取的步骤this answer:
UITableViewHeaderFooterView
。UITableView
实例。viewForHeaderInSection
中,您执行let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderView") as! YourHeaderViewSubclass
他指出的最后一件事是:
欺骗性的事情是当
UIView?
确实需要dequeuedReusableHeaderFooterView
或reloadData
时,函数会调用viewForHeaderInSection
,这会导致它消失。
这取决于您正在采用的这两种实现路径中的哪一种,但这应该足以指出您正确的方向。
根据您添加的代码,您似乎在UITableViewHeaderFooterView
内调用yourTableViewInstance.dequeueReusableCell(withIdentifier:for:)
而不是yourTableViewInstance.dequeueReusableHeaderFooterView(withIdentifier:)
。
您需要拥有func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let cellHeader = tableViewHome.dequeueReusableCell(withIdentifier: "header") as! HeaderTableViewCell
// ...
的子类,然后才能正确调用它。创建新的子类,然后更改它:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let cellHeader = tableViewHome.dequeueReusableHeaderFooterView(withIdentifier: "header") as! HeaderTableView
// ...
到此:
UITableViewHeaderFooterView
您需要在此处执行以下两个步骤:
UITableViewCell
而不是fn main() {
let mut a = [1,3,2];
let s = a.sort();
println!("{:?}", s);
}
。答案 1 :(得分:1)
是的,确实如此。
假设这是您的方法的实现:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let customCell = .... as! YourCustomCell
customCell.someLabel.text = "Some Data"
//... filling your curstom cell
return customCell
}
你可以用这种方式改变它
func updateHeaderView(headerView:YourCustomCell, section: Int) {
customCell.someLabel.text = "Some Data"
//... filling your curstom cell
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let customCell = .... as! YourCustomCell
self.updateHeaderView(customCell, section)
return customCell
}
并随时再次致电self.updateHeaderView(customCell, section)
,例如
func buttonClicked() {
let customCell = self.tableView.headerView(forSection: 0) as! YourCustomCell
self.updateHeaderView(customCell, 0)
}
答案 2 :(得分:1)
我做了什么,工作得非常正确,请按照给出的答案:
SWIFT 3.1
第1步:
首先我拿了一个view
xib,根据我的要求设计并在我要求的课程中注册。
其次,class HeaderView: UITableViewHeaderFooterView
UITableViewHeaderFooterView
如下图所示:
在我要求的课程(这里是家庭课程)中,我确实为我的tableview注册了我的xib
文件。
override func viewDidLoad() {
super.viewDidLoad()
tableViewHome.register(UINib(nibName: "HeaderView", bundle: nil), forHeaderFooterViewReuseIdentifier: "HeaderView")
}
第2步:
然后在我要求的课程中,我做了以下:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let cellHeader = tableViewHome.dequeueReusableHeaderFooterView(withIdentifier: "HeaderView") as! HeaderView
cellHeader.filterAction(cellHeader.filter1Btn)
return cellHeader
}
它开始按照我的要求工作,后来我在我的班级中添加了自定义委托以获得更多动作,但是通过子视图,它现在正在工作。
答案 3 :(得分:0)
我认为您的标题视图类正在扩展UITableViewHeaderFooterView类。在扩展名中添加功能
extension UITableViewHeaderFooterView{
func reloadHeaderCell(){
preconditionFailure("This method must be overridden")
}
}
现在在下面的Header类中覆盖此
class HeaderView: UITableViewHeaderFooterView {
override func reloadHeaderCell() {
////// add your logic to reload view
}
}
现在,您只需在下面的行中调用即可刷新视图
self.tableView?.headerView(forSection:0)?.reloadHeaderCell()