Ansicht Sammlung cellForItemAt indexPath nicht immer genannt (Swift)
Erstellte ich eine collection view controller aus dem Storyboard, und legen Sie die benutzerdefinierte Klasse ItemCollectionVC
die individuelle Klasse seiner Zelle zu ItemCell
und setzen Sie den reuse-identifier zu Cell
Hier mein ItemCollectionVC
Klasse:
import UIKit
private let reuseIdentifier = "Cell"
class ItemCollectionVC: UICollectionViewController {
var dataSourceItems: [Items] = []
var counterBuildItems: [Items] {
let weaponItemArray = WeaponItems.weaponItems as [Items]
let defenseItemArray = DefenseItems.defenseItems as [Items]
return weaponItemArray + defenseItemArray
}
var freeBuildItems = WeaponItems.weaponItems as [Items]
var captureKrakenItems: [Items] {
let weaponItemArray = WeaponItems.weaponItems as [Items]
let abilityItemArray = AbilityItems.abilityItems as [Items]
return weaponItemArray + abilityItemArray
}
override func viewDidAppear(_ animated: Bool) {
switch self.presentingViewController!.title! {
case "CounterBuildVC":
dataSourceItems = counterBuildItems
case "FreeBuildVC":
dataSourceItems = freeBuildItems
case "CaptureKrakenVC":
dataSourceItems = captureKrakenItems
default:
break
}
}
override func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return dataSourceItems.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! ItemCell
cell.cellImage.image = dataSourceItems[indexPath.row].image
print(dataSourceItems.count)
return cell
}
}
Wenn die Sammlung view-controller vorgestellt wird, ist es leer, was könnte das problem verursachen?
- Haben Sie überprüfen Sie die Anzahl der Arrays und laden Sie Ihre Sammlung sehen?
- Wo nennst du
reloadData()
auf der collection view-Instanz? - Ich habe es nicht nennen, muss ich?
- Meine schlechte, Sie nicht haben zu, es ist ein
UICollectionViewController
- Ich habe es, es gibt kein problem
- siehe meine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie sind ziemlich sicher, dass die
dataSource
von der collectionView ist verbunden mit dem viewController (es sollte standardmäßig sein), dann sollten SiereloadData()
weil die collectionView Lesen vondataSourceItems
. Zu verstehen ist der Fall, fügen Sie einen Haltepunkt incellForItemAt
und ein weiteres inviewDidAppear
und überprüfen Sie, welche zuerst angerufen?Hoffe, das hat geholfen.
viewDidAppear
wird zuerst angerufen, heißt das nicht, sollte es ein problem sein, ohne die Daten neu laden?viewDidAppear
erstennumberOfItemsInSection
genannt wird, und 24 nachreloadData
Eines der drei Dinge, die dieses problem verursacht hat, so ziemlich jedes mal, wenn ich Sie angetroffen haben, in einem TableView oder
CollectionView
:1) Ihre
ViewController
ist nicht die Datenquelle desUICollectionView
2)
numberOfRows
odernumberOfSections
Methode gibt 0 zurück,3) Die Höhe der Zelle 0 ist, entweder durch constraint-Probleme, oder eine
heightForCell
Methode wird nicht/falsch implementiert.Es ist unmöglich zu sagen, welche von diesen Ihr problem, und es ist immer möglich, dass Sie begegnet sind, etwas seltsam. Stellen Sie sicher, daß keines dieser Probleme, bevor Sie weniger wahrscheinlich Optionen.
Müssen Sie Ihren code in viewWillAppear, dann wird es richtig funktioniert.
/*
}
Wie diese :-
*/
Einige Dinge, die Sie könnte leicht zu übersehen, wenn Sie storyboard
1) vergessen Sie nicht, dass der Inhalt der Zelle muss angeschlossen haben Oben, Unten und Einschränkung
Inhalte anzeigen muss, die Höhe, die von dieser Zelle kennen, um Höhe für die Zelle. Wenn Sie nicht über diese, die Zelle, die Höhe ist 0, und die Funktion cellForItemAt wird nie aufgerufen.
2) können Sie layout-Zelle zu setzen, dynamische Zelle und Höhe für eine Zelle, wenn Sie diese Funktion verwenden:
In meinem Fall gab es ein problem mit der Ansicht Sammlung contentInset, versuchen Sie folgenden code in Ihre Sammlung anzeigen sub-Klasse.