2017-11-19 8 views
0

現在、NetflixまたはSpotify側のスクロールビューのように動作するように設定されたテーブルビューがあります。これを行うために、リスト内のすべての項目のサブビューを保持していた個々のテーブルセルにスクロールビューを追加しました。dequeueReusableCellがセル上の古いビューを消去しない

テーブルビューでは古いセルからスクロールビューが消去されないため、少しスクロールして新しいスクロールビューが表示されてしまうことがあります。

私はここで私は、関連する

TableViewCellだと思うのコードで、これはdequeueReusableCellが機能する方法に関係していると仮定します。

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

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

SideScroll - クラスscrollviewを設定し、追加するための責任がそれ

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. 
    } 
} 

そして方法についての私のセル私は少し複雑なパターを使用しています(実際にはcellForRowAtない原因に個々のビューオブジェクトnは、それは同じことをして、私はそれのためのコードを投稿しませんので、問題はそのパターンから来ているとは思いません。)

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 
} 

答えて

1

テーブルビューセルが再利用されます。古い状態を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() 
     } 
    } 
} 
+0

これは非常に重要です。私はサブビューをプログラム的に自分の細胞に追加しています。私は 'prepareForReuse'をオーバーライドしなければならないということを知りませんでした。誰かがコレクションビューをスクロールして、毎回メモリが上がったり、古いビューの上に新しいビューが表示されたら、このメソッドをセルに追加してください。ありがとう、ジェフ – Jimbo

関連する問題