UIViewController maintient une référence à UICollectionView. Le contrôleur doit modifier la structure de flux intégrée à l'aide de UICollectionViewDelegateFlowLayout.
Il est assez facile de définir la source de données de la vue sur elle-même:
MyViewController.m
- (void)viewDidLoad
{
self.collectionView.dataSource = self;
}
Mais comment définir le contrôleur pour qu'il soit la disposition de flux de délégués de la vue?
- (void)viewDidLoad
{
self.collectionView.dataSource= self;
// self.collectionView.??? = self;
}
J'ai essayé:
- (void)viewDidLoad
{
self.collectionView.dataSource= self;
self.collectionView.collectionViewLayout = self;
}
Mais j'obtiens l'erreur suivante: "Types de pointeurs incompatibles affectant ...".
Le fichier d'en-tête de collection ressemble à ceci:
MyViewController.h
@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
Juste self.collectionView.delegate = self;
. Notez que UICollectionViewDelegateFlowLayout
hérite de UICollectionViewDelegate
.
J'admets qu'il peut vous prendre au dépourvu au début.
Oh et ça ne marchera que si self.collectionView.collectionViewLayout
est actuellement défini sur votre structure de flux. (ou réglé avec initWithFrame:collectionViewLayout:
)
Selon la réponse précédente, juste un exemple d'utilisation. Ce n'est vraiment pas clair mais je peux montrer comment cela fonctionne:
@interface PrettyViewController()<UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
//some code
@end
@implementation PrettyViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.collectionView.delegate = self;//bingo! right here
}
#pragma mark - UICollectionViewDelegateFlowLayout
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
return CGSizeMake([[UIScreen mainScreen] bounds].size.width, 20.0);
}
@end
mes deux cents pour OSX Mojave - Swift
(Je suis tombé ici à la recherche de NSCollectionView ... Je sais que la question portait sur UICollectionView ..)
Tout ce qui précède (spécifier un délégué implique également la taille de la cellule) est également correct pour OSX.
[~ # ~] notez [~ # ~] si vous écrivez:
classe MyViewController: NSCollectionViewDelegate, NSCollectionViewDataSource, NSCollectionViewDelegateFlowLayout {
la méthode:
func collectionView (_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize
sera être appelé.
SI enlevé, aucune méthode déléguée ne sera appelée. (comme la classe n'obéit pas au protocole).