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")