我正在使用一个使用故事板的现有应用程序,但我想继续开发而不使用故事板或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 )
答案 0 :(得分:1)
来自UIViewController
documentation:
var navigationController: UINavigationController?
最近的 作为导航的视图控制器层次结构中的祖先 控制器。
这意味着当您在视图控制器中调用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