我一直在尝试以编程的方式重做我的应用程序的工作。(没有使用故事板)
我差不多完成了,除了手动操作导航控制器。
我一直在做一些研究,但我找不到任何文件实现这手动。(我开始作为一个单视图应用程序开发这个应用程序)
目前,我只有1个 viewcontroller
导航控制器,将在应用程序的所有页面中使用。
如果有人能够帮助我,或者发送一个链接到一些适当的文档,以便通过编程方式完成这项工作,我将不胜感激。
编辑:
我忘了说是斯威夫特的。
试试这个,它会指导你如何使用导航控制器。
在 iOS 中编程创建 UINavigationController
应用委托 h
#import <UIKit/UIKit.h> #import "LoginViewController.h" @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong,nonatomic) UINavigationController *navigationController; @property (strong,nonatomic) LoginViewController *loginVC; @end
应用代表
#import "AppDelegate.h" #import "LoginViewController.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.loginVC = [[LoginViewController alloc]initWithNibName:nil bundle:nil]; self.loginVC.title = @"Login Page"; self.navigationController = [[UINavigationController alloc]initWithRootViewController:self.loginVC]; self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible]; }
然后,当您想要推动其他视图控制器时,可以简单地使用下面的代码来移动到另一个视图控制器。
- (IBAction)pushMyProfileView:(id)sender { self.myProfileVC = [[MyProfileViewController alloc]initWithNibName:nil bundle:nil]; [appDelegate.navigationController pushViewController:self.myProfileVC animated:YES]; }
迅捷1,2:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var nav1 = UINavigationController() var mainView = ViewController(nibName: nil, bundle: nil) //ViewController = Name of your controller nav1.viewControllers = [mainView] self.window!.rootViewController = nav1 self.window?.makeKeyAndVisible() }
Swift 4 + : 和 Swift 5 +
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { self.window = UIWindow(frame: UIScreen.main.bounds) let nav1 = UINavigationController() let mainView = ViewController(nibName: nil, bundle: nil) //ViewController = Name of your controller nav1.viewControllers = [mainView] self.window!.rootViewController = nav1 self.window?.makeKeyAndVisible() }
我建议以下面这个框架开始您的应用程序代理:
1)尽量使用 让!
2) UINavigationController 具有 RootViewController属性。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let viewController = ViewController(nibName: nil, bundle: nil) //ViewController = Name of your controller let navigationController = UINavigationController(rootViewController: viewController) self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.window?.rootViewController = navigationController self.window?.makeKeyAndVisible() return true }
self.window = UIWindow(frame: UIScreen.main.bounds) let storyboard = UIStoryboard(name: "Main", bundle: nil) let storyboard_Secondary = UIStoryboard(name: "Secondary", bundle: nil) var initialViewController = UIViewController() let aUser = CommonMethods.loadCustomObject("\(Constants.kUserProfile)") as? User if aUser?.respCode == 1 { initialViewController = storyboard_Secondary.instantiateViewController(withIdentifier: "MainTabVC") UIApplication.shared.statusBarStyle = .lightContent let navigationController = UINavigationController(rootViewController: initialViewController) navigationController.isNavigationBarHidden = true self.window!.rootViewController = navigationController self.window!.makeKeyAndVisible() }
对于那些使用 SceneRegiate.swift 构建新项目的人来说,您可以使用‘ var 窗口: UIWindow?而不是应用委托中删除的“ var 窗口”
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } window?.windowScene = windowScene window?.makeKeyAndVisible() let viewController = ViewController() let navViewController = UINavigationController(rootViewController: viewController) window?.rootViewController = navViewController }
以下是 SceneCommittee 类中的另一个例子:
var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) let navController = UINavigationController() let viewController = ViewController() navController.viewControllers = [viewController] window.rootViewController = navController self.window = window window.makeKeyAndVisible() } }
这可能有点夸张,但是我发现自己经常这样做,所以我只是扩展了 UIViewController 并创建了一个嵌入式 InNavigationController 方法。现在我可以直接调用 viewController。
extension UIViewController { func embedInNavigationController() -> UINavigationController { return UINavigationController(rootViewController: self) } }