我一直试图以编程方式重新制作我的应用程序。(不使用故事板)
我快做完了,唯独手动创建导航控制器还没完成。
目前,我只有一个视图控制器。当然还有appDelegate。
导航控制器将在整个应用程序的所有页面中使用。
如果有人能帮我,或者发送一些适当的文档链接来以编程方式完成这个操作,那将非常感激。
编辑:
我忘了提到它是用Swift编写的。
我一直试图以编程方式重新制作我的应用程序。(不使用故事板)
我快做完了,唯独手动创建导航控制器还没完成。
目前,我只有一个视图控制器。当然还有appDelegate。
导航控制器将在整个应用程序的所有页面中使用。
如果有人能帮我,或者发送一些适当的文档链接来以编程方式完成这个操作,那将非常感激。
编辑:
我忘了提到它是用Swift编写的。
在AppDelegate.swift中
Swift 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()
}
UINavigationController(rootViewController: _)
初始化器来代替将一个元素的数组分配给 viewControllers
属性。但这只是为了节省一行代码 :) - Kirill Dubovitskiy对于使用 SceneDelegate.swift 构建的较新项目,您可以在 SceneDelegate 中使用 'var window: UIWindow?' 替代已移除的 AppDelegate 中的 'var window'。
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
}
我建议您使用以下骨架开始编写AppDelegate:
1) 尽可能使用let!
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
}
这里是SceneDelegate类的另一种实现:
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()
}
}
AppDelegate.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
AppDelegate.m
#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];
}
这可能有点过度,但我发现自己经常这样做,所以我扩展了UIViewController并创建了一个embedInNavigationController方法。现在我只需要调用viewController.embedInNavigationController。
extension UIViewController {
func embedInNavigationController() -> UINavigationController {
return UINavigationController(rootViewController: self)
}
}
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()
}