¿Por qué no puedo llamar a la predeterminada super.init() en UIViewController en Swift?

No estoy utilizando una UIViewController a partir de un guión y quiero tener un custom init función de donde yo pase una NSManagedObjectID de algún objeto. Sólo quiero llamar super.init() como tengo en Objective-C. Como este:

init(objectId: NSManagedObjectID) {
    super.init()
}

Pero me sale el siguiente error del compilador:

Debe llamar designado inicializador de la superclase UIViewController

Puedo simplemente no hacer esto más?

InformationsquelleAutor SirRupertIII | 2014-06-07

4 Kommentare

  1. 106

    El designado initialiser para UIViewController es initWithNibName:bundle:. Usted debe llamar a ese lugar.

    Ver http://www.bignerdranch.com/blog/real-iphone-crap-2-initwithnibnamebundle-is-the-designated-initializer-of-uiviewcontroller/

    Si usted no tiene una punta, pasar en nil para la nibName (paquete es opcional también). A continuación, puede crear una vista personalizada en loadView o mediante la adición de subvistas a self.view en viewDidLoad, mismo que se utiliza para.

    • Por eso ahora es imposible para mí hacer una personalizada método init en un UIViewController subclase que no es de una punta?
    • Ahh, gracias!! Yo estaba pasando «» para la punta de nombre.
    • Primordial initWithNibName:bundle: por sí sola no es suficiente; el compilador dará un error, y le sugiero que también implementar la (necesaria) initWithCoder:. Supongo que ambos son designados inicializadores? Pero sólo withCoder queda marcada como «necesaria» en swift…
    • Oh, después de cavar un poco, resulta que initWithCoder: viene de la NSCoding protocolo… yo todavía no puede averiguar cuál es su papel en la inicialización de un UIViewController ejemplo, si se trata de un «designado» inicializador de UIViewController o de cualquiera de sus superclases…
    • Gracias! Para un rápido copiar/pegar a llamar a este después de la configuración de su let propiedades, si los hubiere: super.init(nibName: nil, bundle: nil).
    • Init Con el codificador se utiliza para cuando se necesita para hacer la restauración del estado. Cuando se guarda el estado de la viewcontroller utilizando el estado de la restauración de la funcionalidad, el programador volverá a los valores que se guardan cuando el estado se salvó. Desde allí se puede reconstruir el controlador de vista de su último estado inicial a partir de cuando se cerró la aplicación. Así que para el usuario su donde la dejaron de

  2. 39

    Otra buena solución es declarar su nuevo inicializador como un convenience inicializador de la siguiente manera:

    convenience init( objectId : NSManagedObjectID ) {
        self.init()
    
        //... store or user your objectId
    }

    Si se declara no designado inicializadores en la subclase a todos, se heredan automáticamente y usted es capaz de utilizar self.init() dentro de su conveniencia inicializador.

    En caso de UIViewController el valor predeterminado método init se llame init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) con nil para ambos argumentos (Comando-Clic en UIViewController le dará esa información).

    TL;TR: Si usted prefiere trabajar mediante programación con UIViewControllers aquí es un completo ejemplo de trabajo que añade un nuevo inicializador con una costumbre argumento:

    class MyCustomViewController: UIViewController {
        var myString: String = ""
    
        convenience init( myString: String ) {
            self.init()
    
            self.myString = myString
        }
    }
    • Esta es una solución más elegante y funciona en cualquier caso genérico
    • He intentado hacer esto en una extensión, y de forma recursiva se llamó a sí misma.
    • cuando usted proporciona su código como una idea, te puedo decir por qué.
    • El «truco» a esta respuesta es que myString se establece en "" por lo que el init no es necesario. Esta solución se cae a pedazos si usted no desea utilizar un valor inicial, y en ese caso, usted necesita para utilizar self.init(nibName: nil, bundle:nil)
    • o hacer el myString propiedad opcional
    • sí: mi problema es que yo estaba usando el inicializadores SÓLO para evitar opcionales y obtener mi código para compilar.
    • otros): ver mi respuesta en esta pregunta relacionada con la para resolver la recursividad infinita problema.

  3. 11

    Actualización: añadir el enlace

    https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init

    De acuerdo a la documentación para iOS, el designado initialiser para UIViewController es initWithNibName: bundle:.

    Si subclase UIViewController, usted debe llamar a la super aplicación de este método, incluso si usted no está utilizando una PUNTA.

    Usted puede hacerlo de la siguiente manera:

    init(objectId : NSManagedObjectID) {
    
        super.init(nibName: (xib's name or nil'), bundle: nil)
    
       //other code...
    }

    o

    Declarar un nuevo inicializador de la conveniencia de inicializador:

     convenience init( objectId : NSManagedObjectID ) {
    
        self.init()
    
         //other code...

    }

    ¿Por qué no puedo llamar a la predeterminada super.init() en UIViewController en Swift?

    • Usted debe enlace a la original para la atribución, en lugar de dejarlo como una captura de pantalla.
    • He utilizado el mismo proceso que @NcNc dijo. A mí me funcionó. Aquí la link
    • No, él no debe. Enlaces tiene una característica a punto de caducar o mover algún día. Quien quiere ver a un error 404 en lugar de una información que él/ella está buscando?
    • La información es ya aquí, en esta respuesta. (De lo contrario habría sido marcar para eliminación como un vínculo única respuesta.) Pero atribución también es importante para que cualquiera que lea esto puede averiguar de dónde vino y a los créditos. Una captura de pantalla no funciona para eso, pero un enlace. Si un enlace se pudre, así que es lamentable, pero usted no puede posiblemente me dicen que es una situación peor que no tener ningún tipo de crédito que se da a todos. Las objeciones de MODO que ha de enlace-sólo respuestas link-sólo respuestas. No a los enlaces. Link y también información deseada es la formulación.
    • Acabo de añadir el enlace. Gracias por su recordando

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea