Swift 3尝试以编程方式创建和使用UINavigationController

时间:2017-03-25 15:35:04

标签: swift3 uinavigationcontroller

我正在使用一个使用故事板的现有应用程序,但我想继续开发而不使用故事板或nib文件。

现有的左侧菜单是UITableView,它不是根控制器,也没有与之关联的导航控制器。我在app委托中创建了UINavigationController,并希望使用此导航控制器来推送新控制器。我能够呈现一个视图控制器,但我想使用push以符合当前的UIX。

在以下代码中没有任何反应,因为navigationController?返回nil。

这是我在app delegate中的新代码。

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

var navController: UINavigationController?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    navController = UINavigationController()

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

    self.window!.rootViewController = navController

    self.window!.backgroundColor = .red

    self.window!.makeKeyAndVisible()

    let menuViewController = SideMenuViewController()

    menuViewController.navController = navController

然后在我的侧边菜单控制器中:

import UIKit

class SideMenuViewController: UIViewController {

var navController: UINavigationController?

.......

   let myViewController = myViewController()

   self.navigationController?.pushViewController(myViewController, animated: true )

1 个答案:

答案 0 :(得分:1)

来自UIViewController documentation

  

var navigation​Controller:​ UINavigation​Controller?
  最近的   作为导航的视图控制器层次结构中的祖先   控制器。

这意味着当您在视图控制器中调用self.navigationController时,您将获得嵌入了self的(最近的)导航控制器。显然,您的菜单控制器未嵌入导航控制器层次结构中。使用您的app delegate navController成员是实现此功能的一种方法。然后你可以在你的菜单视图控制器中说:

func menuItemFooSelected()
{
    let navController = (UIApplication.shared.delegate as! AppDelegate).navController
    let myViewController = myViewController()
    navController?.pushViewController(myViewController, animated: true)
}

或者(可能最好),当您在app delegate中设置初始结构时,将导航控制器注入侧面菜单控制器:

class MenuViewController: UIViewController
{
    var navController: UINavigationController?
    ...

    func menuItemFooSelected()
    {
        let myViewController = myViewController()
        self.navController?.pushViewController(myViewController, animated: true)
    }
}

application(_:didFinishLaunchingWithOptions:)

...
let menuViewController = MenuViewController(...)
menuViewController.navController = navController