我已经为tableView创建了带有按钮的原型自定义标题单元格。点击按钮时,我试图获取单元格的indexPath,但没有收到。知道我在这里做错了吗?
protocol MediaHeaderCellDelegate: class {
func editPost(cell: MediaHeaderCell)
}
class MediaHeaderCell: UITableViewCell {
weak var delegate: MediaHeaderCellDelegate?
@IBAction func moreOptionsAction(_ sender: UIButton) {
delegate?.editPost(cell: self)
}
}
class NewsfeedTableViewController:UITableViewController, MediaHeaderCellDelegate {
func editPost(cell: MediaHeaderCell) {
guard let indexPath = tableView.indexPath(for: cell) else {
print("indexpath could not be given")
return}
}
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
{
let cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.mediaHeaderCell) as! MediaHeaderCell
cell.delegate = self
cell.media = media[section]
return cell
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.mediaCell, for: indexPath) as! MediaTableViewCell
cell.currentUser = currentUser
cell.media = media[indexPath.section]
cell.delegate = self
return cell
}
}
答案 0 :(得分:2)
因此,这实际上是关于了解节标题所属的节的全部信息?这是我的工作。我有一个标头类:
class MyHeaderView : UITableViewHeaderFooterView {
var section = 0
}
我注册了:
self.tableView.register(
MyHeaderView.self, forHeaderFooterViewReuseIdentifier: self.headerID)
我使用并配置它:
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let h = tableView
.dequeueReusableHeaderFooterView(withIdentifier: self.headerID) as! MyHeaderView
// other stuff
h.section = section // *
return h
}
现在,如果标题视图是可轻敲的或包含按钮或其他内容,那么了解标题的哪个部分就变得微不足道了。
答案 1 :(得分:1)
您的直接问题是您正在使用表格单元作为节标题视图。那不应该做。解决此问题后,下一个任务是从点击了按钮的标题视图中确定表部分。
首先,将MediaHeaderCell
更改为扩展UITableViewHeaderFooterView
的标题视图,并相应地更新协议:
protocol MediaHeaderViewDelegate: class {
func editPost(view: MediaHeaderView)
}
class MediaHeaderView: UITableViewHeaderFooterView {
weak var delegate: MediaHeaderViewDelegate?
@IBAction func moreOptionsAction(_ sender: UIButton) {
delegate?.editPost(cell: self)
}
}
然后,您需要在视图控制器中注册标题视图。
然后更新您的viewForHeaderInSection
:
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: Storyboard.mediaHeaderView) as! MediaHeaderView
view.delegate = self
view.media = media[section]
view.tag = section
return view
}
最后,更新您的协议方法实现:
func editPost(view: MediaHeaderView) {
let section = view.tag
// do something
}
有一个可能的问题。如果您的表允许添加或删除节,则在点击按钮时,标题视图的标签可能是错误的。