在没有故事板的情况下开始 ios 个项目
starting ios project without storyboard
我在使用 xibs 而不是故事板启动 iOS 应用程序时遇到了一些麻烦。问题是我得到一个黑屏并且没有调用第一个视图控制器(向 viewDidLoad
方法添加了断点)。
在应用程序委托 header 中,我已声明:
@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];
查看一些论坛我发现我应该分配 window 所以我将其添加为函数的第一行
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
问题是,当我这样做时,应用程序在从 didFinishLaunchingWithOptions
方法返回后崩溃(没有任何痕迹的 SIGABRT)。
我还尝试将 navController
设为 属性 并实例化默认 UIViewController
class 初始化相同的 xib
我做错了什么?
感谢和问候
这是一种"out of the box"解决方案,因此与您的代码无关。特别是因为我没有发现您的代码有任何问题。
我遇到了同样的问题并尝试了很长时间来修复代码,对我有用的是找到一个使用 xibs 的示例项目(例如 github)。
下载并编辑它以保证您的应用程序正常工作。很遗憾 Xcode 想要强迫我们使用他们的故事板来解决这类问题。
我没有尝试使用 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.
}
然后绿色出现在屏幕上。
在为 window 设置根视图控制器之前初始化 window。
这是我在您的代码中看到的唯一问题,因为根 ViewController 设置为零 window,然后您正在初始化。
要更改您的项目以使用 xib 而不是故事板,请首先为每个视图控制器创建一个 xib。您需要将文件的所有者更改为 class 到您为其创建 xib 的视图控制器。然后link xib 中视图的文件所有者视图出口。
之后,select 您的应用定位并将主界面下拉菜单更改为空。现在您可以删除故事板文件了。
最后,在应用委托的 application:didFinishLaunchingWithOptions:
方法中初始化您的 window 并将您的初始视图控制器设置为 window 的根视图控制器。然后在您的应用委托 window 上调用 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;
}
将主界面留空
将新的 ViewController.xib 添加到项目并将其文件的所有者 class 标记为 "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;
}
构建和运行
希望对您有所帮助:
删除视图控制器和故事板文件以及新的 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;
}
好的,我终于明白了。
我所要做的就是再次添加
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
之后,只需删除.h、.m 和.xib,然后重新创建即可。
出于任何原因,它现在工作正常。
在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
}
Xcode 11 与 SceneDelegate
在SceneDelegate.m
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.windowScene = (UIWindowScene *)scene;
self.viewController = [[ViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
self.window.rootViewController = navController;
[self.window makeKeyAndVisible];
}
无需在 AppDelegate.m
中执行任何操作
在 xCode 11:
第一步:
-> 删除故事板文件
第 2 步:
在您的项目 > 常规 > 部署信息 > 主界面 -> 删除对故事板的引用
第 3 步:
在info.plist > Application Scene Manifest > Scene Configuration > Application Session Role > item 0 > storyboard name
->删除行
第 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"
我在使用 xibs 而不是故事板启动 iOS 应用程序时遇到了一些麻烦。问题是我得到一个黑屏并且没有调用第一个视图控制器(向 viewDidLoad
方法添加了断点)。
在应用程序委托 header 中,我已声明:
@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];
查看一些论坛我发现我应该分配 window 所以我将其添加为函数的第一行
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
问题是,当我这样做时,应用程序在从 didFinishLaunchingWithOptions
方法返回后崩溃(没有任何痕迹的 SIGABRT)。
我还尝试将 navController
设为 属性 并实例化默认 UIViewController
class 初始化相同的 xib
我做错了什么?
感谢和问候
这是一种"out of the box"解决方案,因此与您的代码无关。特别是因为我没有发现您的代码有任何问题。
我遇到了同样的问题并尝试了很长时间来修复代码,对我有用的是找到一个使用 xibs 的示例项目(例如 github)。
下载并编辑它以保证您的应用程序正常工作。很遗憾 Xcode 想要强迫我们使用他们的故事板来解决这类问题。
我没有尝试使用 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.
}
然后绿色出现在屏幕上。
在为 window 设置根视图控制器之前初始化 window。
这是我在您的代码中看到的唯一问题,因为根 ViewController 设置为零 window,然后您正在初始化。
要更改您的项目以使用 xib 而不是故事板,请首先为每个视图控制器创建一个 xib。您需要将文件的所有者更改为 class 到您为其创建 xib 的视图控制器。然后link xib 中视图的文件所有者视图出口。
之后,select 您的应用定位并将主界面下拉菜单更改为空。现在您可以删除故事板文件了。
最后,在应用委托的 application:didFinishLaunchingWithOptions:
方法中初始化您的 window 并将您的初始视图控制器设置为 window 的根视图控制器。然后在您的应用委托 window 上调用 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;
}
将主界面留空
将新的 ViewController.xib 添加到项目并将其文件的所有者 class 标记为 "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;
}
构建和运行
希望对您有所帮助:
删除视图控制器和故事板文件以及新的 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;
}
好的,我终于明白了。
我所要做的就是再次添加
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
之后,只需删除.h、.m 和.xib,然后重新创建即可。
出于任何原因,它现在工作正常。
在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
}
Xcode 11 与 SceneDelegate
在SceneDelegate.m
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.windowScene = (UIWindowScene *)scene;
self.viewController = [[ViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
self.window.rootViewController = navController;
[self.window makeKeyAndVisible];
}
无需在 AppDelegate.m
中执行任何操作在 xCode 11:
第一步:
-> 删除故事板文件
第 2 步:
在您的项目 > 常规 > 部署信息 > 主界面 -> 删除对故事板的引用
第 3 步:
在info.plist > Application Scene Manifest > Scene Configuration > Application Session Role > item 0 > storyboard name
->删除行
第 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"