2016-03-02 74 views
2

当我尝试推送另一个控制器时,我遇到了UINavigationController问题。Swift - UINavigation Controller变为零

的AppDelegate

let testViewController:ProximityQuestionsIntroductionViewController = ProximityQuestionsIntroductionViewController(); 
    self.navController = UINavigationController(rootViewController: testViewController); 

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds); 
    self.window!.rootViewController = navController; 
    self.window!.backgroundColor = UIColor.whiteColor(); 
    self.window!.makeKeyAndVisible(); 

    return true 

ProximityQuestionsIntroductionViewController

class ProximityQuestionsIntroductionViewController:UIViewController { 

// Controls 
var proximityIntroductionView:ProximityQuestionsIntroductionView!; 

// Load components when the view is loaded 
override func viewDidLoad() { 
    super.viewDidLoad(); 

    print("nav in viewDidLoad : \(self.navigationController)"); 
    //Hide Nav bar 
    self.navigationController?.navigationBarHidden = true; 
    // Set view 
    self.proximityIntroductionView = ProximityQuestionsIntroductionView(frame: self.view.frame); 
    self.view = self.proximityIntroductionView; 
} 

func start(){ 
    print(self); 
    print("start in controller"); 
    let nextController = ProximityQuestionsProgressViewController(); 
    print("nav in start : \(self.navigationController)"); 
    self.navigationController?.pushViewController(nextController, animated: true); 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

我打电话从一个按钮被按下时,我ProximityQuestionsIntroductionViewstart。 在日志中,我看到“导航在开始:无”,并且控制器不会更改。

欲了解更多信息:

  • 自我是真正的ProximityQuestionsIntroductionViewController

  • 导航栏真隐

所以导航控制器是viewDidLoad确定,但不是在其他功能。

有人能告诉我为什么吗?

谢谢!

编辑:AppDelegate中

 self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 

    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("ProximityIntroduction"); 
    self.navController = storyboard.instantiateViewControllerWithIdentifier("NavigationController") as! UINavigationController; 
    self.navController?.setViewControllers([initialViewController], animated: false) 
    self.window?.rootViewController = navController; 
    self.window?.makeKeyAndVisible(); 

我添加导航控制器到故事板并更改ID。但我仍然有对UINavigationController一个nil值的函数start

回答

0

问题来自视图。

这样做:

// Set view 
    self.proximityIntroductionView = ProximityQuestionsIntroductionView(frame: self.view.frame); 
    self.view = self.proximityIntroductionView; 

导致该问题。我不知道为什么,但将所有UIView放入控制器直接解决了问题。

0
self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 

    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("ProximityQuestionsIntroductionViewController") 
    navigationController = UINavigationController.init(rootViewController:initialViewController) 
    navigationController?.setViewControllers([initialViewController], animated: false) 
    self.window?.rootViewController = navigationController 
    self.window?.makeKeyAndVisible() 

认沽故事板ID,此ProximityQuestionsIntroductionViewController

+0

我试图做所有我的项目没有故事板,所以我有一个:'NSInvalidArgumentException',原因:'故事板()不包含视图控制器与标识符'ProximityQuestionsIntroductionViewController'' –

+0

那么你使用xib进行设计? –

+0

我以编程方式完成这一切。这是一个由其他人开始的项目,我不能读故事板它是一团糟。 –

0

你必须标记窗口和navController变量可选:

var window : UIWindow? 
var navController : UINavigationController? 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
{ 
    let testViewController:ProximityQuestionsIntroductionViewController = ProximityQuestionsIntroductionViewController(); 

    self.navController = UINavigationController(rootViewController: testViewController); 

    if let window = window { 

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds); 
    self.window!.rootViewController = navController; 
    self.window!.backgroundColor = UIColor.whiteColor(); 
    self.window!.makeKeyAndVisible(); 
    } 
    return true 
} 

如果您是通过Xcode模板创建项目的: 从Info.plist中删除键“Main storyboard file base name”的键值对。 删除故事板文件Main.storyboard。

+0

这就是我第一次发布问题时的代码。它不起作用,self.navigationController在第一个控制器的函数启动中暂停。 –