开始没有故事板的ios项目
我有一些麻烦,启动一个iOS应用程序使用XIB而不是故事板。 问题是,即时通讯黑屏和第一个视图控制器没有被调用(添加断点到viewDidLoad
方法)。
在应用程序委托头我已经声明:
@property (strong, nonatomic) UIWindow window; @property (strong, nonatomic) ViewController *viewController;
而在didFinishLaunchingWithOptions
方法我有这个实现:
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; navController.navigationBarHidden = YES; self.window.rootViewController = navController; [self.window makeKeyAndVisible];
看过一些论坛,我发现我应该分配窗口,所以我添加这个函数的第一行
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
问题是,当我这样做,从didFinishLaunchingWithOptions
方法(SIGABRT没有任何跟踪)返回后,应用程序崩溃。
我也试图让navController
属性,并实例化一个默认的UIViewController
类,启动相同的xib
我究竟做错了什么?
感谢致敬
希望这可以帮助你:
删除视图控制器和故事板文件以及新的viewController.h,viewController.hm,viewController.xib文件。
#import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate @synthesize viewCOntrollerobj; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewCOntrollerobj = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewCOntrollerobj]; //navController.navigationBarHidden = YES; self.window.rootViewController = navController; [self.window makeKeyAndVisible]; return YES; }
-
保留主界面空白
-
将新的ViewController.xib添加到项目中,并将其文件的所有者类标记为“ViewController”
-
在AppDelegate.m中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"ViewController" owner:nil options:nil]; ViewController* vc = [xibContents objectAtIndex:0]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc]; self.window.rootViewController = navigationController; [self.window makeKeyAndVisible]; return YES;
}
-
build立和运行
好的,我终于明白了。
我所要做的只是再次添加
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
之后,只需删除.h,.m和.xib,然后重新创build它们。
由于任何原因现在工作正常。
我没有尝试用XIB,但这个东西在这里工作正常:::
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.viewController = [[ViewController alloc] init]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; navController.navigationBarHidden = YES; self.window.rootViewController = navController; [self.window makeKeyAndVisible]; // Override point for customization after application launch. return YES; }
并在ViewController的viewDidLoad
- (void)viewDidLoad { [super viewDidLoad]; [self.view setBackgroundColor:[UIColor greenColor]]; // Do any additional setup after loading the view, typically from a nib. }
绿色出现在屏幕上。
在设置窗口的根视图控制器之前,初始化窗口。
这是我在你的代码中看到的唯一的问题,因为rootViewController被设置为一个零窗口,然后你正在初始化。
要将项目更改为使用xib而不是故事板,请首先为每个视图控制器创build一个xib。 您将需要将文件所有者更改为正在创buildxib的视图控制器。 然后将文件所有者视图出口链接到xib中的视图。
之后,select您的应用程序目标,并将主界面下拉列表变为空。 现在,您可以删除故事板文件。
最后,在应用程序委托的application:didFinishLaunchingWithOptions:
初始化您的窗口application:didFinishLaunchingWithOptions:
方法,并将您的初始视图控制器设置为窗口的根视图控制器。 然后在你的应用程序委托的窗口上调用makeKeyAndVisible
,你应该很好。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [UIWindow new]; self.window.rootViewController = [ViewController new]; [self.window makeKeyAndVisible]; return YES; }
在Swift 3.0中
//MARK: Initial View Controller func initialViewController(){ self.window = UIWindow(frame: UIScreen.main.bounds) let rootViewController = UIViewController(nibName: "HomeVC", bundle: nil) let navigation : UINavigationController = UINavigationController(rootViewController: rootViewController) navigation.isNavigationBarHidden = true self.window?.rootViewController = navigation self.window?.makeKeyAndVisible() }
在appdelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { initialViewController() return true }
这是一种“开箱即用”的解决scheme,因此与您的代码无关。 特别是因为我没有看到你的代码有什么问题。
我有同样的问题,并尝试了很长时间来修复代码,什么对我工作find一个示例项目(在github例如)使用xibs。
下载它,然后编辑它使你的应用程序保证工作。 Xcode想迫使我们使用他们的故事板来解决这些问题是一件令人遗憾的事情。