在动态 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 顶部到 UITableView 顶部
Swift:当节标题高度动态更改时,UITableView 滚动回顶部