在没有故事板的情况下开始 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;
}
  1. 将主界面留空

  2. 将新的 ViewController.xib 添加到项目并将其文件的所有者 class 标记为 "ViewController"

  3. 在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;
    

    }

  4. 构建和运行

希望对您有所帮助:

删除视图控制器和故事板文件以及新的 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"