2016-07-12 7 views
5

Ich bin eine benutzerdefinierte Navigationssteuerung zu schaffen. Ich habe so etwas wie dies:Fatal error: Verwendung von unimplemented initializer in benutzerdefinierter Navigation

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 
    } 
} 

Ich wollte dies testen, so habe ich eine CustomNavigationController wie folgt aus:

CustomNavigationController(rootViewController: ViewController()) 

Wenn ich die app laufen bekomme ich diese:

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

Ich sehe das Problem nicht, kann mir jemand helfen?

+0

was 'Delegat = self'? bereits nach dem Löschen, dass ich Ihren Code ohne Problem laufen konnte – Aladin

+0

, dass die UINavigationControllerDelegate ist. – user1007522

Antwort

6

UINavigationController Implementierung init(rootViewController:) wahrscheinlich Anrufe self.init(nibName:bundle:), die Sie nicht implementiert haben, so dass es den Fehler wirft.

Sie sollten Sie bereits außer Kraft setzen init(nibName:bundle) zusätzlich zu den initializers außer Kraft setzen. init(nibName:bundle:) ist ein ausgewiesener initializer während init(rootViewController:) eine Bequemlichkeit initializer ist.

+1

init (rootViewController :) kann kein Convenience-Initialisierer sein. Wie in den Delegierungsregeln für Initialisierer (in der Antwort von @ Jack unten aufgeführt) angegeben, kann ein designierter Initialisierer nur einen anderen designierten Initialisierer aufrufen. Es sollte ein Compiler-Fehler sein, wenn Sie versuchen, einen Superklassen-Convenience-Initialisierer von einem bestimmten Unterklassen-Initialisierer aufzurufen. – Cognitio

4

Während individuelle Navigation-Controller verwenden, benötigen wir override init Eigenschaft 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 Klasse Gebrauch verwenden -

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 
    } 
} 

Per Apple-Dokument - die vereinfachen Beziehungen zwischen designierten und praktischen Initialisierungen Swift wendet die folgenden drei Regeln für Delegierungsaufrufe zwischen initii an 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

Verwandte Themen