Accéder au contenu principal

Articles

Affichage des articles du octobre, 2019

[General] UIDocumentInteractionController not available

Lorsque l'on porte une application sur Mac Catalyst, il y a un problème avec les UIDocumentInteractionController... Les logs disent : [General] UIDocumentInteractionController not available Dans ce cas, là plusieurs cas de figure... Cas 1 :  On essaye juste de visualiser un fichier standard, par exemple un PDF... Dans ce cas on peut remplacer le document interactif par un simple open. Dans l'application IOS il faut laisser le document interactif car sinon on sort de l'application. Mais sur un Mac ce n'est pas grave. -( IBAction ) info :( UIButton *)sender {     NSURL * url = [[ NSBundle mainBundle ] URLForResource : @"TaPytha" withExtension : @"pdf" ]; #if TARGET_OS_MACCATALYST     [[ UIApplication sharedApplication ] openURL :url options : @{} completionHandler : nil ]; #else     documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:url];     assert(documentInteractionController)

Sélecteur non reconnu.

Il arrive qu'un objet Objective-C ne pointe pas sur la bonne classe. Par exemple on met un cast sur un objet, celui-ci est un NCDictionary et on croit que c'est un NSString. Dans ce cas l'application plantera par exemple avec un appel à "length" qui existe en NSString mais pas en NSDictionary. Malheureusement, la plupart du temps le débuggeur vous emmènera à "main()" à la place de la ligne qui a causé le plantage. Pour cela vous pouvez ajouter un "symbolic breakpoint" avec dans "symbol" : -[NSObject doesNotRecognizeSelector:]

_UISheetInteractionBackgroundDismissRecognizer

Avec IOS13 les FormSheet et les PageSheet peuvent être quittés par un geste de glissement vers le haut. Mais si votre UIViewController contient un élément qui utilise les déplacements de doigts (UITouch) alors cela ne fonctionne plus à cause de la gestion de ce geste. Pour désactiver le geste, utilisez le code suivant : -( void ) viewDidAppear :( BOOL )animated {     [ super viewDidAppear :animated];     for ( UIGestureRecognizer *gr in self . presentationController . presentedView . gestureRecognizers ) {         if ( @available (iOS 11.0 , *)) {             if ([gr. name isEqualToString : @"_UISheetInteractionBackgroundDismissRecognizer" ]) {                 // disable la possibilité de quitter la feuille FormSheet ou PageSheet avec un glissement vers le haut                 gr. enabled = false ;             }         }     } }

TARGET_OS_MAC

Lorsque l'on désire compiler différemment selon que l'on soit sur iPhone ou sur Mac, naturellement on fait : #if TARGET_OS_MAC   // code pour le mac #else   // code pour iPhone iPad #endif Mais l'on a tort ! Car TARGET_OS_MAC renvoie 1 même si l'on est sous iPhone ! Il faut inverser le test pour que cela fonctionne : #if TARGET_OS_IPHONE   // code pour iPhone iPad #else   // code pour le mac #endif Ou utiliser TAGET_OS_OSX qui lui renvoie zéro avec un iPhone et un iPad. #if TARGET_OS_OSX   // code pour le mac #else   // code pour iPhone iPad #endif C'est nul, je sais... Mais il faut le savoir, un iPhone est un Mac... Au passage, vous pouvez aussi pour être plus précis utilisez TARGET_OS_MACCATALYST.

Parcourir des dates avec NSDate

Pour utiliser NSDate nous avons besoin de dire de quoi nous parlons... En effet une date n'a de sens que par rapport à un calendrier (Arabe, Hébreux, Japonais, etc...). Notre calendrier (à nous français) est le calendrier grégorien. Nous avons donc besoin d'une variable NSCalendar initialisée en grégorien. NSCalendar * calendar = [[ NSCalendar alloc ] initWithCalendarIdentifier :  NSCalendarIdentifierGregorian ]; Ensuite si nous avons besoin de récupérer un élément de la date, nous avons besoin d'une variable NSDateComponent NSDateComponents * components = [calendar components : NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay fromDate :[ NSDate new ]]; Le  [ NSDate new ] fournit la date du jour. Vous devez définir quelles parties de la date vous intéresse, quels composants. Ici, par exemple nous coulons récupérer : - L'année : NSCalendarUnitYear - Le mois : NSCalendarUnitMonth - Le jour dans le mois : NSCalendarUnitDay Après, nous