【问题标题】:starting ios project without storyboard在没有情节提要的情况下启动 ios 项目
【发布时间】:2015-10-26 13:07:18
【问题描述】:

我在使用 xibs 而不是情节提要启动 iOS 应用程序时遇到了一些麻烦。问题是我得到一个黑屏并且第一个视图控制器没有被调用(在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

我做错了什么?

感谢和问候

【问题讨论】:

  • 您是否在目标的常规设置中删除了对“主”情节提要的引用?
  • @Jasper 是的,我删除了对情节提要的引用,也删除了 info.plist 中的引用。我还尝试将 ViewController.xib 添加到常规设置(不起作用)
  • 据我所知,您做的一切都是正确的。也许尝试清理您的项目,甚至删除您的派生数据
  • @Jasper 我也试过这个解决方案,它一直失败:S
  • 能否请您更新您的 didFinishLaunchingWithOptions 的完整代码。

标签: ios objective-c xib


【解决方案1】:

在 xCode 11 中:

第一步:

-> 删除storyBoard文件

第二步:

在你的项目>常规>部署信息>主界面->删除对故事板的引用

第 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"

【讨论】:

    【解决方案2】:

    带有 SceneDelegate 的 Xcode 11

    在 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 中做任何事情

    【讨论】:

    • 谢谢。我会及时回去将它应用到 iOS9-ObjC 项目中:D
    【解决方案3】:

    在 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
    }
    

    【讨论】:

    • 您不必指定navigation的类型。
    【解决方案4】:

    希望对您有所帮助:

    删除视图控制器和storyboard文件,新建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;
    
    }  
    

    【讨论】:

    • 故事板及其引用已被删除。我发布了解决方案:只需删除并再次创建 .h、.m 和 .xib
    【解决方案5】:

    好的,我终于明白了。

    我所要做的就是再次添加

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    在此之后,只需删除 .h、.m 和 .xib 并重新创建它们。

    无论出于何种原因,它现在都可以正常工作了。

    【讨论】:

    • 奇怪!你不应该那样做。很高兴您至少找到了解决方案。
    • @Joze 我同意。不管怎样,它现在可以工作了,呵呵。如果您再次遇到此问题,请尝试以这种方式修复它
    • 如果有人有兴趣,这里有详细的一步一步如何用图片来做到这一点。 xcodenoobies.blogspot.my/2015/10/…
    • 感谢@Rocotilos。无论如何,这似乎只是一个 xCode 错误
    【解决方案6】:
    1. 主界面留空

    2. 将新的 ViewController.xib 添加到项目中,并将其文件的所有者类标记为“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. 构建并运行

    【讨论】:

    • xib 的内容是一个视图
    【解决方案7】:

    要更改您的项目以使用 xibs 而不是故事板,首先要为每个视图控制器创建一个 xib。您需要将文件的所有者更改为您正在为其创建 xib 的视图控制器。然后将 File's Owner 视图出口链接到 xib 中的视图。

    之后,选择您的应用目标并将主界面下拉菜单更改为空。现在您可以删除情节提要文件了。

    最后,在应用代理的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;
    }
    

    【讨论】:

    • 爱它。干净、简单且有效(从 info.plist 中删除所有与故事板相关的内容)。
    【解决方案8】:

    我没有尝试使用 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 窗口,然后您正在初始化。

    【讨论】:

    • 这里你没有使用指定的xib,这正是OP想要的。
    • 我正在这样做。正如我之前所说,如果我实例化窗口,则应用程序在 didFinishLaunchingWithOptions 方法之后崩溃,没有任何痕迹
    【解决方案9】:

    这是一种“开箱即用”的解决方案,因此与您的代码无关。特别是因为我没有发现您的代码有任何问题。

    我遇到了同样的问题并尝试了很长时间来修复代码,对我有用的是找到一个使用 xibs 的示例项目(例如在 github 中)。

    下载并编辑它以确保您的应用程序可以正常工作。很遗憾 Xcode 想要强迫我们使用他们的故事板来解决这些问题。

    【讨论】:

    • 我没有。我要试一试
    • 一定要喜欢那些沉默的反对者。如果您要投反对票,您至少可以发表评论,以便我可以改进或在不合适的情况下彻底删除我的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    相关资源
    最近更新 更多