Ich möchte eine Variable in meinem Code, der den Index meiner UICollectionView verfolgt, aber ich kann es nicht zum Funktionieren bringen. Nach einiger Fehlersuche habe ich den Code auf den folgenden Code reduziert, der, wenn er in einen leeren viewController eingefügt wird, funktionieren sollte, da kein Storyboard involviert ist. Das animierte gif veranschaulicht das Problem. Anfangs ist meine Variable "selectedItem
" gleich dem UICollectionView-Zelle-Text, der die data = [0,1,2,3]
widerspiegelt, aber wenn ich dann nach rechts wische, wird sie sofort um 1. Dann bleibt sie um 1 bis zur letzten Zelle, wo sie wieder übereinstimmt. Das Muster wiederholt sich beim Rückwärtsfahren. Vielen Dank für jede Hilfe -Wie UICollectionView-Index verfolgen
import UIKit
class CodeCollView2: UIViewController, UICollectionViewDataSource,UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
var data = [0,1,2,3] //["0", "1", "2", "3" ]
let cellId = "cellId2"
var selectedItem = 0
lazy var cView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.minimumLineSpacing = 0
let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
cv.isPagingEnabled = true
cv.dataSource = self
cv.delegate = self
return cv
}()
var indexLabel: UILabel = {
let label = UILabel()
label.text = ""
label.font = UIFont.systemFont(ofSize: 30)
return label
}()
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
}
func setupViews() {
cView.register(CCell2.self, forCellWithReuseIdentifier: cellId)
view.addSubview(cView)
cView.translatesAutoresizingMaskIntoConstraints = false
cView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
cView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
cView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
cView.heightAnchor.constraint(equalToConstant: 200).isActive = true
view.addSubview(indexLabel)
indexLabel.translatesAutoresizingMaskIntoConstraints = false
indexLabel.bottomAnchor.constraint(equalTo: cView.topAnchor).isActive = true
indexLabel.centerXAnchor.constraint(equalTo: cView.centerXAnchor).isActive = true
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return data.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! CCell2
selectedItem = indexPath.item
indexLabel.text = "seletedItem = \(selectedItem)"
cell.itemValue = data[selectedItem]
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return collectionView.frame.size
}
}
//============== CVCell ==================
class CCell2: UICollectionViewCell {
var itemValue: Int? {
didSet {
if let val = itemValue {
itemLabel.text = "\(val)"
}
}
}
var itemLabel: UILabel = {
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 100)
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .lightGray
addSubview(itemLabel)
itemLabel.translatesAutoresizingMaskIntoConstraints = false
itemLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
itemLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Sie können nicht auf 'cellForItemAt verlassen:' Sein in einer bestimmten Reihenfolge aufgerufen. Wenn Ihr collectionView so dimensioniert ist, dass immer nur ein einzelnes Objekt angezeigt wird, können Sie wahrscheinlich die Delegate-Methode 'willDisplay: forItemAt:' verwenden, um das Element auf dem Bildschirm zu verfolgen. – Paulw11
Korrigieren Sie mich, wenn ich falsch liege, aber CollectionView ist nicht so intelligent, weil es beim Scrollen einen vorgeschlagenen Versatz gibt. Die Verwendung von 'willDisplay: forItemAt' reicht nicht aus, wenn mehrere Objekte gleichzeitig auf dem Bildschirm erscheinen können. Sie könnten wahrscheinlich den aktuellen Index von diesem Offset ableiten, nachdem ein Scroll aufgetreten ist. –