2016-07-12 24 views
5

Sto creando un controller di navigazione personalizzato. Ho qualcosa di simile:Errore irreversibile: uso di inizializzatore non implementato nel controller di navigazione personalizzato

public class CustomNavigationController: UINavigationController { 

    // MARK: - Life Cycle 

    override init(rootViewController: UIViewController) { 
     super.init(rootViewController: rootViewController) 

     delegate = self 
    } 

    required public init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     delegate = self 
    } 
} 

ho voluto mettere alla prova questo fuori così ho creato un CustomNavigationController come questo:

CustomNavigationController(rootViewController: ViewController()) 

Quando eseguo l'applicazione ottengo questo:

fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class 'TestApp.CustomNavigationController' 

Non vedo il problema, qualcuno può aiutarmi?

+0

ciò che è 'delegato = self'? dopo aver appena cancellato che potrei eseguire il tuo codice senza problemi – Aladin

+0

Questo è il UINavigationControllerDelegate. – user1007522

risposta

6

UINavigationController L'implementazione di init(rootViewController:) probabilmente chiama self.init(nibName:bundle:) che non è stata implementata in modo da generare l'errore.

È necessario sostituire lo init(nibName:bundle) in aggiunta agli inizializzatori che già si sovrascrivono. init(nibName:bundle:) è un inizializzatore designato mentre init(rootViewController:) è un inizializzatore di convenienza.

+1

init (rootViewController :) non può essere un inizializzatore di convenienza. Come indicato nelle regole di delega di inizializzazione (elencate nella risposta di @ Jack in basso), un inizializzatore designato può richiamare solo un altro inizializzatore designato. Dovrebbe essere un errore del compilatore se si tenta di chiamare un inizializzatore della superclasse da un inizializzatore della sottoclasse designato. – Cognitio

4

Durante l'utilizzo di controller di navigazione personalizzata, abbiamo bisogno di usare override init proprietà di NavigationController as-

class CustomNavigationController: UINavigationController { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

    } 
    override init(rootViewController: UIViewController) { 
     super.init(rootViewController: rootViewController) 
    } 
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    } 

} 

& in Appdelegate classe di utilizzo -

import UIKit 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     self.window = UIWindow(frame: UIScreen.main.bounds) 
     let vc = ViewController(nibName: "ViewController", bundle: nil) 
     let navi = CustomNavigationController(rootViewController: vc) 
     window?.backgroundColor = .white 
     window?.rootViewController = navi 
     window?.makeKeyAndVisible() 
     return true 
    } 
} 

Come da documento di Apple - Per semplificare il relazioni tra inizializzatori designati e convenienza, Swift applica le seguenti tre regole per le chiamate di delegazione tra initi alizers:

Rule 1 A designated initializer must call a designated initializer from its immediate superclass.

Rule 2 A convenience initializer must call another initializer from the same class.

Rule 3 A convenience initializer must ultimately call a designated initializer.

A simple way to remember this is:-

enter image description here

Problemi correlati