gpt4 book ai didi

ios - dequeueReusableCell 不清除单元格上的旧 View

转载 作者:行者123 更新时间:2023-11-28 15:12:47 26 4
gpt4 key购买 nike

我现在有一个表格 View ,它被设置为像 Netflix 或 Spotify 侧 ScrollView 一样工作。为此,我向每个单独的表格单元格添加了一个 ScrollView ,该表格单元格包含列表中每个项目的 subview 。

我遇到的问题是表格 View 没有清除旧单元格的 ScrollView ,所以一旦我向下滚动一点,旧的 ScrollView 就会开始出现在新的 ScrollView 后面。

我认为这与 dequeueReusableCell 的工作方式有关,所以这是我认为相关的代码

表格 View 单元格:

class MenuItemsScrollCell: UITableViewCell {
@IBOutlet weak var scrollView: UIScrollView!

func setup(for scrollItems: [ScrollItemView]) {
let sideScroll = SideScroll(scrollItems: scrollItems, scrollView: scrollView)
sideScroll.build()
}
}

SideScroll - 负责设置 ScrollView 并向其添加单个 View 对象的类

class SideScroll: NSObject {
var scrollItems: [UIView]!
weak var scrollView: UIScrollView!
}

extension SideScroll {
convenience init(scrollItems: [UIView], scrollView: UIScrollView) {
self.init()
self.scrollItems = scrollItems
self.scrollView = scrollView
}
func build(){
for (index, scrollItem) in scrollItems.enumerated() {
setSizeOf(scrollItem)
setPositionFor(scrollItem, at: index)
scrollView.addSubview(scrollItem)
}
setContentSize(for: scrollView)
// setSizeOf(:scrollItem), setPositionFor(:scrollItem,at:index) and setContentSize(for:scrollView) all do exactly what you would expect them to.
}
}

然后是我的 cell for 方法(实际上不是 cellForRowAt,因为我使用的是稍微复杂一点的模式,但它做同样的事情,我不认为问题来自该模式,所以我不会发布代码为它。)

func cell(for row: Int, in tableView: UITableView) -> UITableViewCell {
guard let menuItemsScrollCell = tableView.dequeueReusableCell(withIdentifier: "MenuItemsScrollCell") as? MenuItemsScrollCell else {
fatalError("Was expecting MenuItemsScrollCell. Got Something Else." )
}
let menuItems = self.menuItems(at: row) // Returns an array of menu item model objects that correlates to one row of the table.
let scrollItemViews = populateScrollItemViews(for: menuItems)
menuItemsScrollCell.setup(for: scrollItemViews) // Method from first code sample
return menuItemsScrollCell
}

func populateScrollItemViews(for menuItems: [MenuItem]) -> [ScrollItemView] {
var output = [ScrollItemView]()
for menuItem in menuItems {
guard let scrollItemView = Bundle.main.loadNibNamed("ScrollItemView", owner: nil, options: nil)![0] as? ScrollItemView else {
fatalError()
}
scrollItemView.titleLabel.text = menuItem.title
}
return output
}

最佳答案

表格 View 单元格被重用。您需要清除 prepareForReuse() 中的旧状态。

class MenuItemsScrollCell: UITableViewCell {
@IBOutlet weak var scrollView: UIScrollView!

func setup(for scrollItems: [ScrollItemView]) {
let sideScroll = SideScroll(scrollItems: scrollItems, scrollView: scrollView)
sideScroll.build()
}

override func prepareForReuse() {
super.prepareForReuse()
for subview in scrollView.subviews {
subview.removeFromSuperview()
}
}
}

关于ios - dequeueReusableCell 不清除单元格上的旧 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47373019/

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