Accéder au contenu principal

editActionsForRowAtIndexPath et trailingSwipeActionsConfigurationForRowAtIndexPath

Lorsque l'on passe une application de l'iPad au Mac avec Catalyst, certaines fonctions se retrouvent deprecated. C'est le cas de editActionsForRowAtIndexPath qui permet de rajouter des bouton sous la ligne d'une table. La solution préconisée par Apple est d'utiliser trailingSwipeActionsConfigurationForRowAtIndexPath mais cette fonction est apparue avec IOS11 et mes applications fonctionne à partie de IOS9.
On doit donc mettre les deux fonctions avec des #if TARGET_OS_....

Voici un exemple de fonction qui fonctionne de IOS9 à IOS13 :

#if !TARGET_OS_MACCATALYST

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView

                  editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {



    UITableViewRowAction *action_reuse =

    [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault

                                       title:@"Utiliser"

                                     handler:^(UITableViewRowAction *action,NSIndexPath *indexPath) {

                                         [self reutiliser:indexPath];

                                     }];

    action_reuse.backgroundColor = [UIColor systemTealColor];


    UITableViewRowAction *action_suppr =

    [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive

                                       title:@"Supprimer"

                                     handler:^(UITableViewRowAction *action,NSIndexPath *indexPath) {

                                         [self supprimer:indexPath];

                                     }];

    action_suppr.backgroundColor = [UIColor systemRedColor];


    return @[ action_suppr, action_reuse ];

}

#endif


Vous remarquerez le #if !TARGET_OS_MACCATALYST au tout début.
Voici la même chose pour Mac :

#if TARGET_OS_MACCATALYST

/* UISwipeActionsConfiguration available IOS11 */

- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView

trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {


    NSMutableArray<UIContextualAction*>* actions = [NSMutableArray new];


    [actions addObject:[UIContextualAction

                        contextualActionWithStyle:UIContextualActionStyleNormal

                        title:@"Utiliser"

                        handler:^(UIContextualAction *action

                                  , __kindof UIView *sourceView,

                                  void(^completionHandler)(BOOL actionPerformed)){

        [self reutiliser:indexPath];

        completionHandler(true);

    }]];


    [actions addObject:[UIContextualAction

                        contextualActionWithStyle:UIContextualActionStyleDestructive

                        title:@"Supprimer"

                        handler:^(UIContextualAction *action

                                  , __kindof UIView *sourceView,

                                  void(^completionHandler)(BOOL actionPerformed)){

        [self supprimer:indexPath];

        completionHandler(true);

    }]];


    return [UISwipeActionsConfiguration configurationWithActions:actions];

}

#endif


Evidemment, si vous avez définit que votre application fonctionnerait à partir de IOS11, 12, 13 vous n'avez qu'à mettre la nouvelle version (et enlever la compilation conditionnelle).



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

UISceneSession is only available on iOS 13

Lorsque vous faites une nouvelle application, celle-ci est par défaut pour le dernier IOS.  Mais si vos clients, comme les miens, ont de vieux appareils, vous pourriez vouloir que votre application fonctionne avec IOS9 (pour le moment on peut encore faire des apps IOS9, mais je crois que la limite sera IOS12 dans pas longtemps). Dans les infos de déploiement, vous changez donc le IOS 14  en IOS 9. Mais, le lancement de l'app vous donne un écran noir ! Pour régler le problème, il faut ajouter une propriété "window" dans l'interface du appDelegate. @interface AppDelegate : UIResponder < UIApplicationDelegate > @property ( strong , nonatomic ) UIWindow * window ; @end Reste les warnings... Le plus simple est de faire confiance à Xcode, tapez sur les warnings et un menu vous proposera un "fix" qui ajoutera un API_AVAILABLE à la définition de la fonction. - ( void ) scene :( UIScene *)scene willConnectToSession :( UISceneSession *)session options :(