启动没有故事板的ios项目

时间:2015-08-04 08:12:19

标签: ios objective-c xib

我在使用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

我做错了什么?

谢谢和问候

9 个答案:

答案 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;

}  

enter image description here

答案 1 :(得分:1)

  1. 将主界面保留为空enter image description here

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

答案 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()
}
在appdelegate.swift

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想强迫我们使用他们的故事板来解决这些问题。