with from custom ios uiviewcontroller swift storyboard xib

ios - from - No se puede cargar el archivo XIB de UIViewController en Storyboard en Swift



load xib swift 4 (2)

Lo que sucedió es que Seed 5 rompió el mecanismo mediante el cual un controlador de vista puede encontrar su xib por su nombre, si el controlador de vista es una clase Swift. La razón es que el nombre de la clase, en la mente de Swift, no es el mismo que el nombre que le dio (y el nombre que le dio al archivo xib); el nombre ha sido "mutilado", en particular al anteponer el nombre del módulo (es decir, las clases Swift tienen espacio de nombres).

Ofrezco tres soluciones:

  • Su solución alternativa es buena (cargue el archivo .xib por nombre explícitamente)

  • Denomine el archivo .xib MyModule.TestViewController.xib , donde MyModule es el nombre de su paquete (es decir, el nombre del proyecto) (esto es lo que Apple aconseja, pero lo odio)

  • Utilice @objc(TestViewController) antes de la declaración de class del controlador de visualización para superar el cambio de nombre que es lo que está rompiendo el mecanismo (este es el enfoque que yo prefiero)

Vea mi discusión aquí: https://stackoverflow.com/a/25163757/341994 y mi discusión posterior vinculada desde allí: https://stackoverflow.com/a/25152545/341994

EDITAR Este error está solucionado en iOS 9 beta 4. Si la búsqueda del archivo nib falla, iOS 9 ahora quita el nombre del módulo del nombre de la clase del controlador de vista y realiza la búsqueda del archivo nib una segunda vez.

He leído el uso del guión gráfico de XCode para crear una instancia del controlador de vista que usa XIB para su diseño, pero tengo problemas para hacer que esto funcione en Swift (usando Xcode 6 Beta 6). Me pregunto si he hecho algo mal o si esta funcionalidad ya no está disponible.

Creé un repositorio simple, https://github.com/jer-k/StoryboardTesting-Swift , que muestra el enfoque anterior.

Logré resolver el problema añadiendo y reemplazando a init

required init(coder aDecoder: NSCoder) { super.init(nibName: "TestViewController", bundle: NSBundle.mainBundle()) }

pero me pregunto si todavía es posible que el guión gráfico maneje esto para mí. Crear una superclase para que hereden todos mis UIViewControllers con el código anterior no es la cosa más engorrosa del mundo, pero tengo curiosidad en este punto.


Otra respuesta es:

override func loadView() { if #available(iOS 9, *) { super.loadView() } else { let classString = String(self.dynamicType) NSBundle.mainBundle().loadNibNamed(classString, owner: self, options: nil) } }

enlace: http://japko.net/2014/09/08/loading-swift-uiviewcontroller-from-xib-in-storyboard/

EDITAR:

override var nibName: String? { get { let classString = String(self.dynamicType) return classString } } override var nibBundle: NSBundle? { get { return NSBundle.mainBundle() } }

Esto se ve más hermoso. Funciona en iOS 8/9 (tal vez en iOS 7 también, quién sabe ...))