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