【问题标题】:Swift - UINavigation Controller becoming nilSwift - UINavigationController 变为 nil
【发布时间】:2016-03-02 09:41:58
【问题描述】:

当我尝试推动另一个控制器时,我的UINavigationController 出现问题。

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

当单击按钮时,我从我的ProximityQuestionsIntroductionView 调用start。 在日志中我看到“nav in start : nil”并且控制器没有改变。

更多信息:

  • self 真的是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。但我在函数start 中仍然有UINavigationControllernil

【问题讨论】:

    标签: ios swift uinavigationcontroller


    【解决方案1】:
        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()
    

    为这个 ProximityQuestionsIntroductionViewController 输入故事板 ID

    【讨论】:

    • 我正在尝试在没有故事板的情况下完成我的所有项目,所以我有一个:'NSInvalidArgumentException',原因:'故事板()不包含视图控制器标识符“ProximityQuestionsIntroductionViewController”
    • 那么你是用xib来设计的吗?
    • 我正在以编程方式完成所有操作。这是一个由其他人开始的项目,我只是看不懂故事板,一团糟。
    【解决方案2】:

    您必须将 window 和 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。

    【讨论】:

    • 这就是我第一次发布问题时的代码。不行,self.navigationController在第一个controller的function start中还是nil。
    【解决方案3】:

    问题出在视图上。

    这样做:

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

    导致问题。我不知道具体原因,但是将所有 UIView 放在控制器中直接解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多