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

标签 ios swift uitableview

我现在有一个表格 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/

相关文章:

iphone - 如何阻止 UITableViewCell 中的文本进入披露指示器使用的区域?

ios - IOS如何实现wifi captive portal自动登录?

ios - 从其他 View Controller 调用时动画未运行

ios - 添加和删​​除作为单个对象包的联系人(如在 Facebook Messenger 中)

ios - 快捷按钮概述

Javafx 在对象更改时更新 TableView

javascript - 从 evaluateJavaScript 函数的完成处理程序返回 HTML 字符串

ios - swift - 动画注释更改

ios - CollectionView 约束打破

uitableview - 在自定义 UITableViewCell 中点击按钮时如何更改 View