gpt4 book ai didi

ios - 自定义 UITableview 单元格偶尔会在其他单元格之上重叠/复制

转载 作者:搜寻专家 更新时间:2023-10-31 22:40:06 25 4
gpt4 key购买 nike

我在这里遇到了非常奇怪的问题。

基本上,用户来到一个附加了 TableView 的 View 。调用后端获取一些数据,并在该数据的完成 block 中提供给 TableView 进行显示。

在 cellForRow 1 of 4 reusable 中,自定义单元格根据某种逻辑出列,然后调用该单元格的配置方法。

这就是它变得棘手的地方:一些单元格可能需要进一步的异步调用(为它们的自定义显示获取更多数据),因此需要一个 tableView.reloadRows 调用......发生了什么,然后,最好由这两个来解释截图:

Wrong Right

在第一个单元格中,“有没有想过你会为克朗代克酒吧做些什么?”复制在“Actor 的 self 管理”单元格之上,作为包含 Twitter 信息的单元格,DID 需要额外的异步调用来获取该数据。

有什么想法吗?我在 begin/endUpdates block 内运行 tableView.reloadRows 调用,但没有骰子。

单元格行:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let postAtIndexPath = posts[indexPath.row]
let cell: PostCell!

if postAtIndexPath.rawURL == "twitter.com" {
cell = tableView.dequeueReusableCell(withIdentifier: "TwitterCell", for: indexPath) as! TwitterCell
} else if !postAtIndexPath.rawURL.isEmpty {
cell = tableView.dequeueReusableCell(withIdentifier: "LinkPreviewCell", for: indexPath) as! LinkPreviewCell
} else if postAtIndexPath.quotedID > -1 {
cell = tableView.dequeueReusableCell(withIdentifier: "QuoteCell", for: indexPath) as! QuoteCell
} else {
cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! PostCell
}

cell.isUserInteractionEnabled = true

cell.privacyDelegate = self
cell.shareDelegate = self
cell.likeDelegate = self
cell.linkPreviewDelegate = self
cell.reloadDelegate = self
postToIndexPath[postAtIndexPath.id] = indexPath

if parentView == "MyLikes" || parentView == "Trending" {
cell.privatePostButton.isHidden = true
cell.privatePostLabel.isHidden = true
}

cell.configureFor(post: postAtIndexPath,
liked: likesCache.postIsLiked(postId: postAtIndexPath.id),
postIdToAttributions: postIdToAttributions,
urlStringToOGData: urlStringToOGData,
imageURLStringToData: imageURLStringToData)

cell.contentView.layoutIfNeeded()

return cell
}

异步 ​​Twitter 调用:

private func processForTwitter(og: OpenGraph, urlLessString: NSMutableAttributedString, completion:(() -> ())?) {
let ogURL = og[.url]!
let array = ogURL.components(separatedBy: "/")
let client = TWTRAPIClient()
let tweetID = array[array.count - 1]
if let tweet = twitterCache.tweet(forID: Int(tweetID)!) {
for subView in containerView.subviews {
subView.removeFromSuperview()
}

let tweetView = TWTRTweetView(tweet: tweet as? TWTRTweet, style: .compact)
containerView.addSubview(tweetView)
tweetView.translatesAutoresizingMaskIntoConstraints = false
tweetView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
tweetView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
containerView.leftAnchor.constraint(equalTo: tweetView.leftAnchor).isActive = true
containerView.rightAnchor.constraint(equalTo: tweetView.rightAnchor).isActive = true
containerView.isHidden = false
postText.isHidden = false

} else {
client.loadTweet(withID: tweetID, completion: { [weak self] (t, error) in
if let weakSelf = self {
if let tweet = t {
weakSelf.twitterCache.addTweetToCache(tweet: tweet, forID: Int(tweetID)!)
}
}

if let complete = completion {
complete()
}
})`enter code here`
}

if urlLessString.string.isEmpty {
if let ogTitle = og[.title] {
postText.text = String(htmlEncodedString: ogTitle)
}
} else {
postText.attributedText = urlLessString
}
}

tableviewcontroller 中的完成 block :

func reload(postID: Int) {

tableView.beginUpdates()
self.tableView.reloadRows(at: [self.postToIndexPath[postID]!], with: .automatic)
tableView.endUpdates()

}

注意:这种情况不会 100% 发生,大概与网络有关。

最佳答案

我想问题出在计算单元格上存在的组件的大小上。这就像在数据可用之前设置单元格和框架以及 subview 。

也许你可以试试,

tableView.rowHeight = UITableViewAutomaticDimensiontableView.estimatedRowHeight = yourPreferedHeight

但是你需要确保你的自动布局约束是正确的,并且如果所有组件都有高度,单元格可以确定它的高度。

关于ios - 自定义 UITableview 单元格偶尔会在其他单元格之上重叠/复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48650696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com