Accéder au contenu principal

Sélecteur de fichier (Open) avec MacCatalyst

Dans mon précédent article sur UIMenuBuilder avec MacCatalyst, je créais une entrée de menu open dans le menu Fichier par défaut. Cette entrée lançait la fonction importfile: dans le Responder en cours. Mais je n'expliquais pas comment ouvrir le sélecteur de fichiers...
Voici le code à ajouter dans le ViewController principal :

#pragma mark - Import File

#if TARGET_OS_MACCATALYST

- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller {
    NSLog(@"documentPickerWasCancelled:");
}

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
    NSLog(@"documentPicker:didPickDocumentsAtURLs:");

    UIApplication *app = [UIApplication sharedApplication];
    for(NSURL *url in urls) {
        if([app.delegate application:app openURL:url options:@{ }]==NO) {
            [Usefull AlertWithTitle:url.description
                         andMessage:@"Le fichier ne peut pas être installé."
                      andController:self
                          forAction:nil];
        }
    }
}

-(void)importfile:(id)sender {
    NSLog(@"importfile:");

    // dismiss le viewController visible recursivement jusqu'à retourner à CE viewController (self).
    if([self presentedViewController]) {
        [[self presentedViewController] dismissViewControllerAnimated:YES completion:^{ [self importfile:sender]; }];
        return;
    }
    // Là le viewController visible est le nôtre (self).

    UIDocumentPickerViewController *browser = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[ @"fr.lantranet.LectureFlash" ] inMode:UIDocumentPickerModeImport];

    assert(browser);
    browser.delegate = self;
    browser.allowsMultipleSelection = NO;
    browser.modalPresentationStyle = UIModalPresentationFormSheet;
    browser.directoryURL = [NSURL fileURLWithPath:NSHomeDirectory()];

    [self presentViewController:browser animated:YES completion:nil];
}

#endif


J'ai choisi de forcer le retour à l'écran principal lorsque l'on ouvre un document, vous faites évidemment comme vous voulez. J'ai aussi choisi d'appeler la fonction OpenURL: de l'AppDelegate car celle-ci doit fonctionner pour IOS, donc autant la re-utiliser.
Il faut évidemment que le initWithDocumentTypes soit bien renseigné avec un type déclaré dans votre Info.plist,

et il faut que le réglage de votre SandBox permette l'accès aux fichiers.
Voilà, à partir de là cela doit fonctionner.

Commentaires

Posts les plus consultés de ce blog

IOS14 et Bonjour qui ne fonctionne pas.

 J'utilise Bonjour dans certaines de mes application pour échanger des données entre appareils se trouvant sur le même réseau local.  Depuis IOS14, vous devez déclarer dans info.plist : <key> NSLocalNetworkUsageDescription </key> <string> L'accès au réseau local est obligatoire pour.... </string> <key> NSBonjourServices </key> <array> <string> _http._tcp </string> </array>  La clef NSLocalNetworkUsageDescription est obligatoire pour toute utilisation du réseau local (en dehors des produits Apple comme AirDrop, AirPrint, etc.). C'est la même chose que l'accès à la caméra ou au micro, vous devez dire pourquoi vous désirez cet accès dans votre application. La clef NSBonjourServices est spécifique pour le protocole Bonjour, elle contient la liste des services que vous partagez avec Bonjour. Dans l'exemple, il s'agit d'un serveur web (http).

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 :(

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