在动态 UITableViewCell 的顶部添加一个单元格

Posted

技术标签:

【中文标题】在动态 UITableViewCell 的顶部添加一个单元格【英文标题】:Adding a cell on the top of a dynamic UITableViewCell 【发布时间】:2017-12-28 15:20:47 【问题描述】:

我在 tableView 顶部的新部分中添加一个带有标签的单元格作为第 0 部分,我根据我正在显示的数据类型显示和隐藏此部分。

当主题标签类型帖子中没有数据时它工作正常,然后当有两个或三个项目的数组中显示主题标签数据时它工作正常并且顶部部分 0 单元格显示然后当我向下滚动时再次尝试返回顶部单元格后,AppDelegate 出现错误。

我知道这个问题有点复杂,但我想要实现的是根据我在tableview 中显示的数据类型在我的提要顶部显示和隐藏一个单元格。如果主题标签新闻提要数据则在第 0 部分显示顶部单元格 如果在 tableview 中显示普通新闻提要则只返回一个部分并且不要加载包含单元格的顶部部分。

顺便说一句,我将单元格显示为笔尖。并在viewDidLoad

中声明
let reloadNib = UINib(nibName: "ReloadTableViewCell", bundle: nil)
    feedTableView.register(reloadNib, forCellReuseIdentifier: "reloadCell")

线程 1:EXC_BREAKPOINT(代码=1,子代码=0x102a772a0)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
     let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell


    switch indexPath.section 
    case 0:
        if hashPostsOnly 
            let reloadCell = tableView.dequeueReusableCell(withIdentifier: "reloadCell", for: indexPath) as! ReloadTableViewCell
            return reloadCell  // ERROR AFTER RETURNING CELL

         else 

            //For the protocol delegate i made
            cell.delegate = self
            cell.feed = feeds[indexPath.row]
            cell.postCommentTextView.tag = indexPath.row
            cell.cellIndexPath = indexPath
            cell.userProfilePhotoBtn.tag = indexPath.row
            cell.postMoreCommentsBtn.tag = indexPath.row
            cell.postMoreCommentsBtn.addTarget(self, action: #selector(moreCommentsTapped(_:)), for: .touchUpInside)

            return cell
        
    case 1:

        //For the protocol delegate i made
        cell.delegate = self
        cell.feed = feeds[indexPath.row]
        cell.postCommentTextView.tag = indexPath.row
        cell.cellIndexPath = indexPath
        cell.userProfilePhotoBtn.tag = indexPath.row
        cell.postMoreCommentsBtn.tag = indexPath.row
        cell.postMoreCommentsBtn.addTarget(self, action: #selector(moreCommentsTapped(_:)), for: .touchUpInside)

        return cell
    default:
        return cell
    

func numberOfSections(in tableView: UITableView) -> Int 
    if hashPostsOnly 
        return 2
     else 
        return 1
    


 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    if section == 0 
        if hashPostsOnly 
            return 1

         else 
            return feeds.count
        
     else 
        return feeds.count
    



这是我正在实现的屏幕截图,但是当我向下滚动然后向上滚动时,它会重新加载顶部单元格“重新加载提要”,然后出现错误。

【问题讨论】:

【参考方案1】:

由于只有两个部分并且您有重复的代码,因此可以将事情简化为:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    if indexPath.section == 0 && hashPostsOnly
    
        let reloadCell = tableView.dequeueReusableCell(withIdentifier: "reloadCell", for: indexPath) as! ReloadTableViewCell

        return reloadCell
    
    else
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell

        //For the protocol delegate i made
        cell.delegate = self
        cell.feed = feeds[indexPath.row]
        cell.postCommentTextView.tag = indexPath.row
        cell.cellIndexPath = indexPath
        cell.userProfilePhotoBtn.tag = indexPath.row
        cell.postMoreCommentsBtn.tag = indexPath.row
        cell.postMoreCommentsBtn.addTarget(self, action: #selector(moreCommentsTapped(_:)), for: .touchUpInside)

        return cell
    

【讨论】:

是的,这个答案消除了双出列。我很确定这是你的问题【参考方案2】:

如果不知道您遇到的确切错误或不知道其他地方的代码中是否存在其他问题导致此问题,我无法 100% 确定,但是:

作为一般规则,从表格视图中出列两次并返回单个单元格会以奇怪而神秘的方式做坏事。重构您的代码,仅在需要时对常规单元格进行 deuque,而在显示刷新按钮时不要这样做

【讨论】:

以上是关于在动态 UITableViewCell 的顶部添加一个单元格的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 不使用 Swift 动态调整大小

动态高度 UITableViewCell 闪烁

加载视图控制器时如何滚动到特定的 UITableViewCell 顶部到 UITableView 顶部

Swift:当节标题高度动态更改时,UITableView 滚动回顶部

原型 UITableViewCell 不在 Storyboard 中 UITableView 的顶部

将 UIButton 动态添加到 UITableViewCell 错误