我在使用xibs而不是storyboard启动iOS应用程序时遇到了一些麻烦。问题是我没有调用黑屏和第一个视图控制器(添加了viewDidLoad
方法的断点)。
在app委托标题中我声明了这个:
@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
我做错了什么?
谢谢和问候
答案 0 :(得分:9)
希望这可以帮助你:
删除视图控制器和故事板文件以及新的viewController.h,viewController.h.m,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;
}
答案 1 :(得分:1)
在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;
}
构建并运行
答案 2 :(得分:1)
好的,最后我明白了。
我必须做的就是再次添加
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
在此之后,只需删除.h,.m和.xib并再次创建它们。
由于任何原因,它现在正常工作。
答案 3 :(得分:1)
在xCode 11中:
第一步:
->删除StoryBoard文件
第二步:
在yourProject下> General>部署信息>主界面->删除对故事板的引用
第3步:
在info.plist>应用程序场景清单>场景配置>应用程序会话角色>项目0>情节提要名称中
->删除行
第4步:
在SceneDelegate.m
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.windowScene = (UIWindowScene *)scene;
self.window.rootViewController = [[UINavigationController alloc]
initWithRootViewController:ViewController.new];
[self.window makeKeyAndVisible];
}
确保像这样导入您的viewController头文件:#import“ ViewController.h”
答案 4 :(得分:0)
我没有尝试使用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被设置为nil窗口,之后你正在初始化。
答案 5 :(得分:0)
要将项目更改为使用xib而不是故事板,请先为每个视图控制器创建一个xib。您需要将文件所有者更改为类,以创建用于创建xib的视图控制器。然后将文件的所有者视图出口链接到xib中的视图。
之后,选择您的应用目标并将主界面下拉列表更改为空。现在您可以删除故事板文件。
最后,在app delegate的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;
}
答案 6 :(得分:0)
在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()
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
initialViewController()
return true
}
答案 7 :(得分:0)
带有SceneDelegate的Xcode 11
在SceneDelegate.m
Typer
无需在AppDelegate.m中执行任何操作
答案 8 :(得分:-1)
这是一种开箱即用的#34;解决方案,因此它与您的代码无关。特别是因为我没有看到您的代码有任何问题。
我遇到了同样的问题并且尝试了很长时间来修复代码,对我来说有用的是找到一个使用xib的示例项目(例如在github中)。
下载然后对其进行编辑,以确保您的应用程序正常运行。很遗憾,Xcode想强迫我们使用他们的故事板来解决这些问题。