Accéder au contenu principal

cellForItemAtIndexPath return nil

Dans ma dernière application, comme d'habitude, j'affiche un UIAlertController lorsque l'on tape sur une cellule d'un UICollectionView. J'utilise l'événement didSelectItemAtIndexPath qui fournit l'indexPath de la cellule tapée.

Pour afficher le menu, je dois donner la vue à l'origine du menu et sa position. Très bien... j'utilise cellForItemAtIndexPath pour récupérer la cellule... Mais catastrophe la fonction retourne Nil !
Selon la doc Apple, elle ne le devrait pas, cellForItemAtIndexPath retourne Nil si la cellule n'existe pas ou n'est pas visible mais nous venons de la taper.

La solution est de faire précéder la demande de cellule par un layoutIfNeeded.


        [collection layoutIfNeeded];

        UICollectionViewCell *cell = [collection cellForItemAtIndexPath:indexPath];


Jusque là, j'avais utilisé cellForItemAtIndexPath sans soucis dans une vingtaine d'application. Je n'ai pas trouvé la raison de ce Nil, mais la rustine fonctionne... Il vaut donc mieux le faire tout le temps.

Commentaires

Posts les plus consultés de ce blog

UISwitch dans un UITableViewCell

Je construis des formulaire dans des UITable, chaque UITableViewCell peut donc contenir des UILabel, UISwitch, UIButton, etc. Je partage le code entre plusieurs application, mais j'ai eu un bug dans l'une d'elles que je n'avais pas dans les autres. Les gadgets interactifs ne fonctionnaient pas... En fait, j'avais construit mes UITableViewCell avec du code comme celui-ci : -( instancetype ) initWithStyle :( UITableViewCellStyle )style reuseIdentifier :( NSString *)reuseIdentifier {     self = [ super initWithStyle :style reuseIdentifier :reuseIdentifier];     self . backgroundColor = [ UIColor clearColor ];     _uiLabel = [ UILabel new ];     _uiLabel . frame = CGRectMake ( 8 , 4 , self . frame . size . width - 51 - 24 , self . frame . size . height - 8 );     _uiLabel . translatesAutoresizingMaskIntoConstraints = NO ;     _uiLabel . textAlignment = NSTextAlignmentLeft ;     _uiLabel . lineBreakMode = NSLineBreakByWordWrapping ;     _uiLabel . adjustsFontS

Tiret insécable

 Ecrivant un livre sur CoreAnimation en Objective-C et en Swift, j'écris souvent "Objective-C".  Mais je ne souhaite pas que la césure du texte se face avec le C, il me faut donc un tiret insécable. Malheureusement il n'y a pas de tiret insécable sur le clavier du Mac, il faut donc utiliser le caractère Unicode U+2011. Mais le clavier du Mac ne comprends pas non plus par défaut de possibilité d'ajouter un caractère par son code Unicode.  Il faut donc aller dans les réglages d'Apple, dans les réglages du clavier, dans les méthodes de saisie et ajouter le clavier "Universel (Unicode Hex)". Ensuite, lorsque l'on a besoin d'un caractère Unicode, on change de clavier et on utilise la touche Option + le code en hexadécimal. Pour accélérer le changement d'un clavier à l'autre, toujours dans les réglages du clavier, vous pouvez activer les raccourcis clavier. Bon, c'était encore trop long, alors j'ai mis un remplacement automatique da

Adapter l'interface à la taille des caractères pour malvoyants.

Depuis quelques temps, je fais attention aux réglages de la taille des caractères systèmes. Les malvoyant peuvent décider dans les Réglages de l'iPad, Accessibilité de changer la taille des textes par défaut : Mais dans ce cas, les interfaces sont souvent trop petites, et les texte ne rentre pas dedans. Si vous avez besoin d'une valeur en pixel, en proportion du niveau de zoom des caractères, vous devez utilisez UIFontMetrics. if ( @available (iOS 11.0 , *)) {    larg = [ UIFontMetrics . defaultMetrics scaledValueForValue :larg]; } Ici, vous ne verrez aucune différence à moins de changer les réglages d'accessibilité. Mais, si vous touchez aux réglages, votre valeur en pixels correspondra au niveau de zoom. Cette fonctionnalité n'existe que depuis IOS 11, il faut donc mettre un available si vous compilez comme moi des apps pour IOS9. Je me sers de cette fonctionnalité, par exemple, dans : - ( CGSize ) collectionView :( UICollectionView *)collectionView             layo