0

Dans mon Swift 3/application Obj-C, je suis en train de mettre le délégué de mon RootViewController à son contrôleur de navigation, mais je obtenir l'erreur suivante:Swift 3 - réglage délégué RootViewController au contrôleur de navigation

Cannot assign value of type 'NavController.Type' to type 'RootViewControllerDelegate'

NavController.swift

@available(iOS 10.0, *) 
@objc class NavController: UINavigationController, RootViewControllerDelegate { 

    static func instantiate() -> NavController? { 
     let storyboard = UIStoryboard.init(name: "MyStoryboard", bundle: nil) 
     let navVC = storyboard.instantiateViewController(withIdentifier: "NavController") as? NavController 

     let rootVC = navVC?.viewControllers.first as! RootViewController 
     rootVC.delegate = self // <<<< ERROR OCCURS HERE 

     return navVC 
    } 

    func pressedNextButton() 
    { 
     NSLog("Next button works!") 
    } 
} 

RootViewController.swift

@objc protocol RootViewControllerDelegate { 
    func pressedNextButton() 
} 

@available(iOS 10.0, *) 
@objc class RootViewController: UIViewController, NSFetchedResultsControllerDelegate, UITableViewDataSource, UITableViewDelegate { 

    var delegate: RootViewControllerDelegate? 

    @IBAction func nextButton(_ sender: UIBarButtonItem) { 
     self.delegate?.pressedNextButton() 
    } 
} 

MainProgram.m

@interface MYQAddDeviceViewController() 
    @property (nonatomic, strong) NavController * navVC; 
@end 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.navVC = [NavController instantiate]; 
} 

Toutes les idées sur la façon dont je peux résoudre cette erreur?

+0

Pourquoi avez-vous mis @objc avant la définition de classe sont deux sous-classes de UIViewController?. – Mozahler

+0

Ces classes rapides sont utilisées dans la partie Obj-C de mon application qui nécessite l'utilisation de @objc. – Vee

+0

Vous obtenez cela gratuitement en sous-classant off de uiviewcontroller. En d'autres termes, vous n'en avez plus besoin. – Mozahler

Répondre

3

Vous obtenez cette erreur parce que la ligne

rootVC.delegate = self 

se trouve dans un static func et dans ce contexte, self fait référence à une instance de la NavController métaclasse, à savoir NavController.Type au lieu de NavController.

Vous voulez:

if let navVC = storyboard.instantiateViewController(withIdentifier: "NavController") as? NavController, 
    let rootVC = navVC.viewControllers.first as? RootViewController { 

    rootVC.delegate = navVC 
}