Ich habe UICollectionView
per Code hinzugefügt .
Jetzt stürzt die App mit Meldung ab : UICollectionView must be initialized with a non-nil layout parameter
.
Haben Sie eine Idee, um das Problem zu beheben?
CollectionCell
ist benutzerdefinierte Klasse von UICollectionViewCell
.
@property (nonatomic, strong) UICollectionView* collectionView;
- (void)viewDidLoad
{
[super viewDidLoad];
self.collectionView = [[UICollectionView alloc]init];
[self.collectionView registerClass:[CollectionCell class] forCellWithReuseIdentifier:@"cell"];
UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc]init];
flowLayout.itemSize = CGSizeMake(100, 100);
[flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.collectionView setCollectionViewLayout:flowLayout];
self.collectionView.frame = CGRectMake(0, 60, 320, 500);
self.collectionView.backgroundColor = [UIColor whiteColor];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
[self.view addSubview:self.eventCollection];
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return 20;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
CollectionCell* cell = [self.eventCollection dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
cell.label.text = [NSString stringWithFormat:@"%d", indexPath.item];
return cell;
}
ios
uicollectionview
kusumoto_teruya
quelle
quelle
Antworten:
Der Absturz sagt Ihnen ziemlich explizit, was falsch läuft:
Wenn Sie in der Dokumentation nachsehen
UICollectionView
, werden Sie feststellen, dass der einzige Initialisierer istinitWithFrame:collectionViewLayout:
. In den Parametern für diesen Initialisierer sehen Sie außerdem:Ich habe den wichtigen Teil gewagt . Sie müssen verwenden
initWithFrame:collectionViewLayout:
, um Ihr Objekt zu initialisierenUICollectionView
, und Sie müssen ihm ein Nicht-Null-UICollectionViewLayout
Objekt übergeben.Eine Möglichkeit, dies zu beheben, besteht darin, einfach die Reihenfolge Ihrer Initialisierung zu ändern:
UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc] init]; flowLayout.itemSize = CGSizeMake(100, 100); [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:flowLayout]; [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
Beachten Sie, dass ich im obigen Beispiel davon ausgegangen bin, dass Sie
self.view.frame
als Frame von verwenden möchtenself.collectionView
. Wenn dies nicht der Fall ist, fügen Sie stattdessen den gewünschten Rahmen ein.quelle
Swift 3.0 und Swift 4.0
UICollectionView
Die App stürzte ab, sobald sie bei der
UICollectionView
Initialisierung gestartet wurdeinitialisiere wie unten (oben
viewDidLoad
)let alarmCollectionView:UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init()) let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init()
In Methode (innen
viewDidLoad
)layout.scrollDirection = UICollectionViewScrollDirection.vertical alarmCollectionView.setCollectionViewLayout(layout, animated: true) alarmCollectionView.delegate = self alarmCollectionView.dataSource = self alarmCollectionView.backgroundColor = UIColor.clear self.addSubview(alarmCollectionView)
Hat nach dieser Initialisierung gut funktioniert. Ich verwende Autolayout, also benutze
CGRect.zero
oder benutze dein eigenesCGRect
UICollectionViewController
Falls Sie
UICollectionViewController
stattdessen verwendenUICollectionView
, müssen Sie bei der Initialisierung ein Layout hinzufügenlet testNavController:UINavigationController = UINavigationController.init() let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init() let collectionView:UICollectionViewController = UICollectionViewController.init(collectionViewLayout:layout ) testNavController.pushViewController(collectionView, animated: true)
quelle
UIViewController
es funktioniert gut für michlet layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init() let collectionView:UICollectionViewController = UICollectionViewController.init(collectionViewLayout:layout ) testNavController.pushViewController(collectionView, animated: true)
Hoffe, dass dies funktioniertNur eine schnelle Version von Riley Avrons Antwort
let layout = UICollectionViewFlowLayout() layout.itemSize = CGSizeMake(100, 100) let collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: layout) self.view.addSubview(collectionView) collectionView.delegate = self collectionView.dataSource = self collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellIdentifier")
quelle
Swift 5 allgemeine Lösung
Kann UICollectionViewDelegateFlowLayout verwenden und vergessen Sie nicht, Ihre Zellengröße festzulegen
class YourViewController : UICollectionViewController, UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize.init(width: view.frame.width, height: 250) } override func viewDidLoad() { super.viewDidLoad() self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier) } // initialized with a non-nil layout parameter init() { super.init(collectionViewLayout: UICollectionViewFlowLayout()) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
quelle
Swift 3.0, Swift 4.0 und Swift 5.0
Es ist Arbeit für mich.
let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init())
In Methode (in viewDidLoad)
if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { flowLayout.scrollDirection = .horizontal }
quelle
In Swift
var collectionView: UICollectionView! let layout = UICollectionViewFlowLayout() collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) layout.scrollDirection = .vertical view.addSubview(collectionView)
quelle
setCollectionViewLayout hat das nicht gefallen:
[self.collectionView setCollectionViewLayout:flowLayout];
versuche zu setzen wann init:
[[UICollectionView alloc] initWithFrame:frame collectionViewLayout:defaultLayout];
quelle