无法获取标头中单元格的indexPath

时间:2018-08-17 22:20:42

标签: swift uitableview

我已经为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
     }

}

enter image description here

2 个答案:

答案 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
}

有一个可能的问题。如果您的表允许添加或删除节,则在点击按钮时,标题视图的标签可能是错误的。