ios objective-c swift nsbundle

ios - NSBundle.mainBundle(). PathForResource devuelve nil



objective-c swift (7)

Estoy tratando de escribir un envoltorio simple de IO para Swift.

Para probar esto, tengo un archivo llamado "Test.txt" en la raíz de mi proyecto.

He agregado este archivo a las fases de compilación dentro de los recursos del paquete de compilación, según lo sugerido por todos los demás que han tenido este problema.

He implementado una clase de archivo muy simple con una función de lectura con la intención de generar el contenido del archivo.

class File2{ let resourceName: String let type: String let bundle = NSBundle.mainBundle() init(resourceName: String, type: String = "txt"){ self.resourceName = resourceName self.type = type println(self.bundle) } func read(){ let path = self.bundle.pathForResource("Test.txt", ofType: "txt") //Hard coded these in just to make sure Strings contained no whitespace println(path) //This returns nil...why? var error:NSError? //print(String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)!) //return String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)! } }

Cuando imprimo el contenido del paquete, obtengo un URI en una ubicación específica de mi sistema de archivos, que asumo es la ubicación virtual de la aplicación en el simulador. Navegar hacia él revela que sí contiene mi archivo "Test.txt".

Ahora todo lo que quiero hacer es obtener la ruta a ese archivo.

Hago esto llamando a self.bundle.pathForResource("Test.txt", ofType: "txt")

Esto devuelve "nil"

¿Por qué? :)


El parámetro ofType adjunto al nombre del recurso, así que reemplace esta línea:

let path = self.bundle.pathForResource("Test.txt", ofType: "txt")

a algo como esto:

let path = self.bundle.pathForResource("Test", ofType: "txt")

El Build Bundle Resources también es necesario para verificar.


En Swift 3.0, escribe con

let path = Bundle.main.path(forResource: "Test", ofType: "txt")


No incluya el .txt en el parámetro de nombre , páselo como parámetro de extensión .
De la documentation :

extensión
La extensión de nombre de archivo del archivo para localizar.
Si especifica una cadena vacía o nula, se supone que la extensión no existe y el archivo es el primer archivo encontrado que coincide exactamente con el nombre.

Swift3

let bundle = Bundle.main let path = bundle.path(forResource: "Test", ofType: "txt")

Swift1 y Swift2

let bundle = NSBundle.mainBundle() let path = self.bundle.pathForResource("Test", ofType: "txt")

C objetivo

NSBundle* bundle = [NSBundle mainBundle]; NSString* path = [bundle pathForResource:@"Test" ofType:@"txt"];


Otra razón para que NSBundle.mainBundle (). PathForResource devuelva nil es que el archivo no se haya agregado correctamente al destino. Cuando arrastre y suelte el archivo en el paquete, asegúrese de que la casilla de verificación "Agregar al objetivo" y la casilla "Copiar elementos si es necesario" estén seleccionadas.


Para aquellos de ustedes que están tratando de acceder a los recursos en Pruebas Unitarias, enfrenté un problema donde el recurso no se encontró en el paquete principal y mi solución fue buscar la ruta en todos los paquetes, de esta manera no tengo que especificar un identificador de paquete, donde fileName es una cadena que se pasa a la función y, por supuesto, el tipo puede ser cualquier cosa que desee.

NSString *path; for (NSBundle *bundle in [NSBundle allBundles]) { path = [bundle pathForResource:fileName ofType:@"json"]; if (path) { break; } }


Reemplace su

let path = self.bundle.pathForResource("Test.txt", ofType: "txt")

con

let path = NSBundle.mainBundle().pathForResource("Test", ofType: "txt")


Reemplazar

let path = self.bundle.pathForResource("Test.txt", ofType: "txt")

con

let path = self.bundle.pathForResource("Test", ofType: "txt")