[ios] 응용 프로그램 시작시 응용 프로그램에 루트 뷰 컨트롤러가 있어야합니다

콘솔에 다음과 같은 오류가 발생합니다.

응용 프로그램 시작시 응용 프로그램에 루트 뷰 컨트롤러가 있어야합니다

아래는 내 application:didFinishLaunchWithOptions방법입니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Set Background Color/Pattern
    self.window.backgroundColor = [UIColor blackColor];
    self.tabBarController.tabBar.backgroundColor = [UIColor clearColor];
    //self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"testbg.png"]];

    // Set StatusBar Color
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];

    // Add the tab bar controller's current view as a subview of the window
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

Interface Builder에서 UITabBarController의 대리자는 App Delegate에 연결됩니다.

이 문제를 해결하는 방법을 아는 사람이 있습니까?



답변

나는이 같은 문제가 있었다. main.m을 확인하십시오. 마지막 인수는 UIApplicationDelegate 프로토콜을 구현하는 클래스 이름으로 설정해야합니다.

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");


답변

AppDelegate에서 교체

 [window addSubview:[someController view]];

  [self.window setRootViewController:someController];


답변

로드 된 첫 번째보기 컨트롤러를 변경하려고 할 때 동일한 오류가 발생했습니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

처음에는 오류가 정확히 어디에서 발생했는지 알지 못했기 때문에 오류를 좁히고 무엇이 잘못되었는지 알았습니다. 실제로 화면에 표시되기 전에보기 표시를 변경하려고 시도한 것으로 나타났습니다. 따라서 솔루션은이 코드를 뷰 컨트롤러에서 이동하여 문제를 일으켰습니다.

- (void)viewDidLoad

- (void)viewDidAppear:(BOOL)animated

오류가 더 이상 나타나지 않습니다. 내 문제는 구체적으로 UIAlertView쇼 제작으로 인해 발생했습니다 .

귀하의 경우 tabBarController의 활성 뷰 컨트롤러에서 코드를 확인하는 것이 좋습니다 (해당 뷰 컨트롤러의 문제 일 수 있음). 그래도 작동하지 않으면 코드 대신 nib 파일에서 시작 설정을 설정하십시오. 또는 코드에서 수행하려면 코드를 tabBarController의 활성 뷰 컨트롤러의 적절한 메소드로 이동하십시오.

행운을 빕니다!


답변

“빈 응용 프로그램”템플릿으로 시작한 다음 XIB를 수동으로 추가 할 때이 문제가 발생했습니다. Sunny에서 제안한대로 기본 Nib 이름을 설정하여 문제를 해결했습니다. 이 시나리오에서 누락 된 단계는 제거 중입니다

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

…에서

application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Xib 파일에서 생성 된 창의 인스턴스를 덮어 쓰게됩니다. 이것은 ViewController를 만들고 XIB 파일의 창 및 앱 델리게이트와 연결했다고 가정합니다.


답변

이것은 나에게 일어났다. .plist 파일을 편집하여 해결했습니다. Main nib 파일 기본 이름을 지정하십시오 (MainWindow.xib 여야 함). 이것이 도움이되기를 바랍니다.

여기에 이미지 설명을 입력하십시오


답변

ios5 SDK로 프로젝트를 빌드 할 때 최근에 동일한 문제가 발생합니다. 처음에는 제대로 빌드되고 실행되었지만 그 후에 오류가 나타났습니다.
제 경우에는 해결책이 다소 간단했습니다.
누락 된 것은 어떻게 든 내 응용 프로그램 대상의 요약 탭에서 기본 인터페이스 속성이 지워졌습니다. 다시 설정해야했습니다.

이것이 핵심이 아니며 tabBarController가 여전히 nil이면 항상 프로그래밍 방식으로 창과 루트 컨트롤러를 만들 수 있습니다. 폴백으로 다음 코드를 프로젝트에 추가했습니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (!window && !navigationController) {
        NSLog(@"Window and navigation controller not loaded from nib. Will be created programatically.");
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        UIViewController *viewController1, *viewController2;
        viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
        viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];

        self.tabBarController = [[[UITabBarController alloc] init] autorelease];
        self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
        self.window.rootViewController = self.tabBarController;

    }
    else {
        [window addSubview:[tabBarController view]];
    }
    [self.window makeKeyAndVisible];
    return YES;
}

이것은 sho의 솔루션이 구현 된 경우에만 작동합니다.


답변

iOS9로 업그레이드 하고이 오류가 발생하지 않았습니다. 나는 그것을 고칠 수 있었지만 아래 코드를 추가했다.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *window in windows) {
    if(window.rootViewController == nil){
        UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
        window.rootViewController = vc;
    }
}