以编程方式创建导航控制器(Swift)

我一直在尝试以编程的方式重做我的应用程序的工作。(没有使用故事板)

我差不多完成了,除了手动操作导航控制器。

我一直在做一些研究,但我找不到任何文件实现这手动。(我开始作为一个单视图应用程序开发这个应用程序)

目前,我只有1个 viewcontroller

导航控制器,将在应用程序的所有页面中使用。

如果有人能够帮助我,或者发送一个链接到一些适当的文档,以便通过编程方式完成这项工作,我将不胜感激。

编辑:

我忘了说是斯威夫特的。

122951 次浏览

试试这个,它会指导你如何使用导航控制器。

在 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()
}

类型“ AppDelegate”的值没有成员“ window”

对于那些使用 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)
}
}