Subclass UIAlertController y encuentra errores de time de ejecución

Soy nuevo en progtwigción para iOS y OSX, y decidí comenzar con Swift y usar iOS8 API para una aplicación de testing e intentar algunas técnicas de progtwigción que uso en otros entornos. Sin embargo, me encuentro con una situación extraña que espero que alguien pueda identificar y ayudarme. Esto implica dificultades subclassando UIAlertController.

Este fue mi primer bash:

import UIKit class FubarAlertController: UIAlertController { convenience init (message:String) { self.init(title: "Alert", message: message, prefernetworkingStyle: UIAlertControllerStyle.Alert); self.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) } } 

Sin embargo, recibí las siguientes advertencias en Xcode, que no comprendo, a mis ojos, los errores me parecen contradictorios (perdón por el mal juego de palabras)

 use of self in delegating initializer before self.init is called Self.init is't called on all paths in delegating initialiser 

Entonces intenté

 class FubarAlertController: UIAlertController { convenience init (message:String) { self.init(); self.title = "Alert"; self.message = message; self.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) } } 

y no encontró ningún error en el time de compilation. Sin embargo, cuando uso esto desde un ViewController simple como

 class FubarController: UIViewController { // method invoked when a UIBarButtonItem action takes place @IBAction func enterTextButtonAction(sender: UIBarButtonItem) { let controller = FubarAlertController(message: "Fubar!"); presentViewController(controller, animated: true, completion: nil); } } 

Aparece el siguiente error de time de ejecución que, una vez más, no acabo de entender

 *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIAlertController (<UiToolKit.TextChangedAlertController: 0x7adf2340>) of style UIAlertControllerStyleActionSheet. The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem. If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.' 

Pero, si simplemente implemento FubarAlertController sin ningún método o properties, puedo llamarlo exactamente como si fuera un UIAlertController en la acción del generador de interfaces como

 class FubarController: UIViewController { // method invoked when a UIBarButtonItem action takes place @IBAction func enterTextButtonAction(sender: UIBarButtonItem) { let controller = FubarAlertController(title: "Alert", message: "Fubar!", prefernetworkingStyle: UIAlertControllerStyle.Alert); controller.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) presentViewController(controller, animated: true, completion: nil); } } 

… y todo funciona según lo esperado: no hay time de compilation ni errores de time de ejecución, ¡pero no entiendo por qué!

Entonces mis preguntas son:

(i) ¿Por qué no pude implementar el método init de conveniencia de la manera de mi primer bash? ¿Qué conocimiento mágico me falta aquí? ¿Por qué no podría llamar a un método init de súper class en el context de uno mismo dentro de un iniciador de conveniencia?

(ii) ¿Cómo puedo get el time de ejecución en lugar de comstackr errores en el time cuando subclasss UIAlertController como lo implementé la segunda vez?

Muchas gracias por llegar hasta aquí y con ganas de recibir algunos comentarios. ¡Estoy perplejo!

Sé que esta es una vieja pregunta, pero pensé que podría usar al less una respuesta parcial.

(I) He tenido que hacer lo mismo que tú para get una subclass de UIAlertController funcionando. Creo que la respuesta simple es "No lo hagas". Apple técnicamente no permite subclasss de UIAlertController, según su documentation:

La class UIAlertController está diseñada para ser utilizada tal cual y no admite subclasss. La jerarquía de vista para esta class es privada y no debe modificarse.

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIAlertController_class/

(II) Recibí este mismo error al ejecutar mi aplicación de iPhone en el iPad.

 *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIAlertController of style UIAlertControllerStyleActionSheet. The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem. If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.' 

Como un popover en el iPad no es de pantalla completa, el iPad necesita la propiedad sourceView o sourceRect establecida para determinar en qué pantalla debería aparecer el popover.

Agregue un código como este a su UIAlertController cada vez que configure el estilo en .ActionSheet:

 //For iPad, check that there is a popover and set action button as the sender if let popoverController = controller.popoverPresentationController { //Sender will be a UIButton, cast down to UIView popoverController.sourceView = sender as? UIView popoverController.sourceRect = sender.bounds } 

Es posible que tenga que ajustar esto, dependiendo de su situación. Mi ejemplo anterior provino de una function IBAction donde el sender es un UIButton.