Aprende a mostrar el cuadro de diálogo del archivo del sistema para seleccionar un archivo de su sistema en MacOS usando Swift 5.

Cómo implementar un selector de archivos y directorios en MacOS usando Swift 5

Como una de las cosas más comunes y regulares que necesita implementar en cada aplicación de cada plataforma, debería poder seleccionar archivos y directorios del sistema fácilmente, siguiendo la documentación oficial, por supuesto. Desafortunadamente, no hay muchas fuentes donde pueda obtener indicaciones o ejemplos de cómo implementar un selector de archivos / directorios en MacOS y las que encuentra generalmente están desactualizadas porque no mencionan para qué versión de Swift son.

En este artículo, quiero compartir con ustedes algunos ejemplos de cómo usar el selector de archivos / directorios nativo de MacOS usando Swift 5 que utilizo regularmente en mis aplicaciones.

A. Implementación del selector de archivos

Todo el trabajo es manejado básicamente por la clase NSOpenPanel. En lugar de implementar su propio explorador de archivos,  la clase de panel Abrir se utiliza como una forma muy conveniente de permitir al usuario buscar un archivo o directorio en el sistema. La forma más sencilla de mostrar este cuadro de diálogo y gestionar la selección del usuario se describe en el siguiente fragmento:

let dialog = NSOpenPanel();

dialog.title                   = "Escoge un archivo| Our Code World";
dialog.showsResizeIndicator    = true;
dialog.showsHiddenFiles        = false;
dialog.allowsMultipleSelection = false;
dialog.canChooseDirectories = false;

if (dialog.runModal() ==  NSApplication.ModalResponse.OK) {
    let result = dialog.url // Nombre de ruta del archivo

    if (result != nil) {
        let path: String = result!.path
        
        // ruta contiene la ruta del archivo, por ejemplo
        // /Users/ourcodeworld/Desktop/file.txt
    }
    
} else {
    // El usuario hizo clic en "Cancelar"
    return
}

Simplemente necesitas crear una instancia del NSOpenPanely llamar al runModalmétodo para mostrarlo. Anteriormente, es posible que deba cambiar algunas propiedades predeterminadas como la posibilidad de seleccionar varios archivos, etc. El método devolverá un código que se puede comparar con la NSApplication.ModalResponse estructura, un conjunto de valores de retorno de botón para diálogos modales. Con una condición debe verificar si el usuario ha seleccionado un archivo y ha hecho clic en ok, finalmente debe verificar que la propiedad url de la instancia de diálogo no sea nula y podrá obtener la ruta del archivo seleccionado por el usuario.

A.1. Filtrar por extensión de archivo

En algunos casos, el usuario no debería poder elegir ningún archivo en el sistema, sino archivos con formatos específicos. Por ejemplo, un caso habitual es el hecho del software de manipulación de imágenes, donde el usuario debería poder seleccionar solo imágenes con extensiones como png, jpg o jpeg. El siguiente fragmento debe mostrar un selector de archivos que le permita al usuario seleccionar solo imágenes (como la imagen del artículo):

let dialog = NSOpenPanel();

dialog.title                   = "Choose an image | Our Code World";
dialog.showsResizeIndicator    = true;
dialog.showsHiddenFiles        = false;
dialog.allowsMultipleSelection = false;
dialog.canChooseDirectories = false;
dialog.allowedFileTypes        = ["png", "jpg", "jpeg", "gif"];

if (dialog.runModal() ==  NSApplication.ModalResponse.OK) {
    let result = dialog.url // Ruta del archivo

    if (result != nil) {
        let path: String = result!.path
        
        // ruta contiene la ruta del archivo, por ejemplo
        // /Users/ourcodeworld/Desktop/tiger.jpeg
    }
    
} else {
    // El usuario hizo clic en "Cancelar"
    return
}

A.2. Seleccionar varios archivos

Si desea permitir que el usuario seleccione varios archivos a la vez, asegúrese de establecer la opción allowMultipleSelection del cuadro de diálogo en verdadero. Entonces, el usuario debería poder seleccionar lo que quiera y cuántos archivos desee. Asegúrese también de cambiar el código para manipular el resultado. En lugar de trabajar con la dialog.urlpropiedad, utilice dialog.urls ya que contiene la matriz con los archivos seleccionados. Puede hacer lo que quiera con los resultados, extraer la ruta de cada elemento de la matriz con la propiedad de ruta como se muestra en el siguiente ejemplo:

let dialog = NSOpenPanel();

dialog.title                   = "Choose multiple files | Our Code World";
dialog.showsResizeIndicator    = true;
dialog.showsHiddenFiles        = false;
dialog.canChooseDirectories    = false;
dialog.allowsMultipleSelection = true;

if (dialog.runModal() ==  NSApplication.ModalResponse.OK) {
    // Los resultados contienen una matriz con todas las rutas seleccionadas
    let results = dialog.urls
    
     // Haz lo que necesites con cada archivo seleccionado
     // en este caso, imprime en la terminal cada ruta
    for result in results {
        // /Users/ourcodeworld/Desktop/fileA.txt
        print(result.path)
    }
} else {
    // El usuario hizo clic en "Cancelar"
    return
}

B. Implementación del selector de directorio

Para la implementación del selector de directorio, usaremos la misma NSOpenPanelclase pero necesitará cambiar las 2 siguientes propiedades al diálogo durante su inicialización:

dialog.canChooseFiles = false;
dialog.canChooseDirectories = true;

Esto permitirá al usuario seleccionar solo directorios en el sistema. El resto de la lógica es básicamente la misma que con el selector de archivos. Por ejemplo:

B.1. Seleccione un solo directorio

El siguiente fragmento muestra la implementación de un selector que permite al usuario seleccionar un solo directorio:

let dialog = NSOpenPanel();

dialog.title                   = "Elija un directorio único | Our Code World";
dialog.showsResizeIndicator    = true;
dialog.showsHiddenFiles        = false;
dialog.canChooseFiles = false;
dialog.canChooseDirectories = true;

if (dialog.runModal() ==  NSApplication.ModalResponse.OK) {
    let result = dialog.url

    if (result != nil) {
        let path: String = result!.path
        
        // ruta contiene la ruta del directorio, por ejemplo
        // /Users/ourcodeworld/Desktop/folder
    }
} else {
    // El usuario hizo clic en "Cancelar"
    return
}

B.2. Seleccionar varios directorios

El siguiente fragmento muestra la implementación de un selector que permite al usuario seleccionar varios directorios al mismo tiempo:

let dialog = NSOpenPanel();

dialog.title                   = "Elija varios directorios | Our Code World";
dialog.showsResizeIndicator    = true;
dialog.showsHiddenFiles        = false;
dialog.allowsMultipleSelection = true;
dialog.canChooseFiles = false;
dialog.canChooseDirectories = true;

if (dialog.runModal() ==  NSApplication.ModalResponse.OK) {
    
    // Los resultados contienen una matriz con todas las rutas seleccionadas
    let results = dialog.urls
    
    // Haga lo que necesite con cada archivo seleccionado
    // en este caso, imprima en el terminal cada ruta
    for result in results {
        // /Users/ourcodeworld/Desktop/folderA
        print(result.path)
    }
} else {
    // El usuario hizo clic en "Cancelar"
    return
}

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores