0

在我的斯威夫特3 /的OBJ-C的应用程序,我想为我设置RootViewController的其导航控制器的代表,但我得到以下错误:斯威夫特3 - RootViewController的委托设置为导航控制器

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

我如何能解决这个错误任何想法?

+0

为什么你的类定义之前把@objc两者都是的UIViewController子类? – Mozahler

+0

这些swift类用于我的应用程序的Obj-C部分,它需要使用@objc。 – Vee

+0

你可以通过从uiviewcontroller继承而获得免费的。换句话说,你不再需要它。 – Mozahler

回答

3

你得到错误,因为该行

rootVC.delegate = self 

是一个static func内,在这方面,selfNavController元类的实例的,亦即NavController.Type代替NavController

你想:

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

    rootVC.delegate = navVC 
}