No se puede cargar el file UIViewController XIB en Storyboard en Swift

He leído usando el guión gráfico XCode para instanciar el controller de vista que usa XIB para su layout, 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 repository simple, https://github.com/jer-k/StoryboardTesting-Swift , que muestra el enfoque anterior.

Logré resolver el problema agregando y anular a init

requinetworking 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 me resuelva esto. Crear una superclass para que todos mis UIViewControllers henetworkingen con el código anterior no es la cosa más engorrosa del mundo, pero solo tengo curiosidad en este punto.

Lo que sucedió es que Seed 5 rompió el mecanismo por el cual un controller de vista puede encontrar su xib por nombre, si el controller de vista es una class Swift. La razón es que el nombre de la class, en la mente de Swift, no es el mismo que el nombre que le diste (y el nombre que le diste al file xib); el nombre ha sido "mutilado", en particular anteponiendo el nombre del module (es decir, las classs Swift tienen espacio de nombres).

Ofrezco tres soluciones:

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

  • Nombre el file .xib MyModule.TestViewController.xib , donde MyModule es el nombre de su package (es decir, el nombre del proyecto) (esto es lo que Apple recomienda, pero lo odio)

  • Use @objc(TestViewController) antes de la statement de class del controller de vista para superar el cambio de nombre que es lo que está rompiendo el mecanismo (este es el enfoque que prefiero)

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

EDITAR Este error se soluciona en iOS 9 beta 4. Si la búsqueda del file nib falla, iOS 9 ahora elimina el nombre del module del nombre de class del controller de vista y realiza la búsqueda del file nib por segunda vez.

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 (quizás también en iOS 7, quién sabe …))