Programming

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

procodes 2020. 2. 25. 22:58
반응형

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


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

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

아래는 내 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;
    }
}

위의 제안 중 어느 것도 내 문제를 해결하지 못했습니다. 광산은 이것이었다 :

더하다:

window.rootViewController = navigationController;

후:

[window addSubview:navigationController.view];

내 appdelegate의

- (void)applicationDidFinishLaunching:(UIApplication *)application {

  • 펜촉 파일에서 "창"을 선택하십시오
  • "속성 관리자"에서 "실행시 표시"를 확인하십시오.

영상![]

  • 이것은 nib 파일이 수동으로 생성 될 때 발생합니다.
  • 이 수정은 스토리 보드 모드가 아닌 일반 펜촉 모드에서 작동합니다.

iOS5 용 RootViewController를 추가하는 방법

앱이 지금까지 RootViewController를 사용하지 않았다면 File> New> New File을 눌러;) 만 작성하십시오. 선택 UIViewController subclass이름을 그 RootViewController , 사용자 인터페이스의와 XIB을 (를 가정 이미 하나를 가지고)의 선택을 취소하고 AppDelegate에 :: didFinishLaunchingWithOptions에서이 코드를 넣어

rootViewController = [[RootViewController alloc] init];
window.rootViewController = rootViewController;

확실하게-RootViewController.h를 가져 와서 변수를 만들어야합니다

다음은 RootViewController 및 AppDelegate에 대한 좋은 기사입니다 .


나는 또한이 오류가 있었지만 이전에 나열된 답변과 달리 새로 생성 된 컨트롤러 (xcode 4.2, ios5)에서 'loadView'메서드를 주석 해제했기 때문에 발생했습니다.

 //Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView  
{
}

그것은 심지어 프로그래밍 방식으로 뷰를 생성하기위한 방법이라고 말했지만, 일반적으로 사용하는 viewDidLoad와 같은 다른 메소드와 너무 비슷해 보였기 때문에 그것을 보지 못했습니다.

프로그래밍 방식으로 펜촉 또는 스토리 보드를 사용하여 뷰 계층 구조를 작성하지 않는 경우 단순히 해당 방법을 제거하십시오.


나는이 문제도 가지고있다. xcode4.2.1에서 프로젝트를 실행했습니다. 나는 모든 의견을 읽었지만 아무도 나를 위해 시원하지 않습니다. 잠시 후, 나는 코드 조각에 주석을 달았다는 것을 알았습니다.

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

그런 다음 주석을 제거했습니다. 모든 것이 괜찮습니다. 이것이 여러분에게 도움이되기를 바랍니다.


응용 프로그램 대리인에게이 기능이 있는지 확인하십시오.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions {
   return YES;
}

didFinishLaunchingWithOptions가 YES를 리턴하는지 확인하십시오. 'return YES'줄을 제거하면 오류가 발생합니다. 이 오류는 스토리 보드 사용자에게 특히 흔할 수 있습니다.


첫 번째보기로 다음 MenuViewController을 추가했습니다.

MenuViewController *menuViewController = [[MenuViewController alloc]init];
self.window.rootViewController = menuViewController;

App Delegate 메소드에서 :

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

효과가있었습니다.


iOS 5.0과 관련하여 약간의 변경이 있었으므로 루트 뷰 컨트롤러가 필요합니다. 코드가 GLES2Sample 과 같은 이전 샘플 코드를 기반으로하는 경우 해당 코드 샘플에서 루트보기 컨트롤러가 작성되지 않았습니다.

를 수정하기 위해 (예를 들어 GLES2Sample) applicationDidFinishLaunching루트 뷰 컨트롤러를 만들고 glView를 연결합니다.

- (void) applicationDidFinishLaunching:(UIApplication *)application
{
  // To make the 'Application windows are expected
  // to have a root view controller
  // at the end of application launch' warning go away,
  // you should have a rootviewcontroller,
  // but this app doesn't have one at all.
  window.rootViewController = [[UIViewController alloc] init];  // MAKE ONE
  window.rootViewController.view = glView; // MUST SET THIS UP OTHERWISE
  // THE ROOTVIEWCONTROLLER SEEMS TO INTERCEPT TOUCH EVENTS
}

이렇게하면 경고가 사라지고 실제로는 앱에 영향을 미치지 않습니다.


탭 막대 컨트롤러의 IBOutlet을 인터페이스 빌더의 루트보기에 연결하십시오.

self.window.rootViewController = self.tabBarController;

그러나 실제로 나는 전에 그러한 오류를 보지 못했습니다.


다음을 수행하여 문제를 해결했습니다 (위의 다른 솔루션 중 어느 것도 도움이되지 않음).

"주 인터페이스"와 관련된 풀다운 메뉴에서 다른 항목을 선택한 다음 "주 창"을 다시 선택하고 다시 빌드하십시오.

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


나는 같은 문제를 겪었지만 storyboard

내 할당 storyboard InitialViewController내 윈도우의에 rootViewController.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
...
UIStoryboard *stb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil];
self.window.rootViewController = [stb instantiateInitialViewController];
return YES;
}

이 문제를 해결했습니다.


Xcode 4.3으로 업그레이드 한 직후에 프로젝트를 처음 시작할 때 (예 : 빈 프로젝트를 만든 다음 UIViewController를 만든 다음 별도의 nib 파일을 만들 때) 동일한 문제가 발생하기 시작했습니다.

내가 사용했던 모든 줄을 넣고 올바른 연결을 유지 한 후에도 오류가 계속 발생했으며 (rootController로 설정된)보기 컨트롤러를 통해로드하려고하는 펜촉 파일은 시뮬레이터에 표시되지 않았습니다.

Xcode를 통해 단일 뷰 템플릿을 만들어 내 코드와 비교 한 결과 문제가 발견되었습니다!

Xcode 4.3은 기본적으로-(void) loadView; 뷰 컨트롤러 구현 섹션으로 그 안의 주석을주의 깊게 읽은 후 문제가 무엇인지 분명해졌습니다. 주석은 프로그래밍 방식으로 뷰를 작성하는 경우 loadView 메소드를 재정의하고 (및 해석 중), 그렇지 않으면 nib를 사용하는 경우 loadView를 재정의하지 않아야합니다. 이 방법에는 다른 것이 없었으므로 nib 파일을 사용하여 메서드를 재정의하고 아무것도하지 않았습니다. 오류가 발생했습니다.

해결책은 구현 섹션에서 loadView 메소드를 완전히 제거하거나 [super loadView]를 추가하여 상위 메소드를 호출하는 것입니다.

NIB 파일을 다른 코드를 추가하면 실제로 덮어 쓰기 때문에 파일을 제거하는 것이 가장 좋습니다.


로그에 이와 동일한 오류 메시지가 있습니다. application : didFinishLaunchingWithOptions에 UIAlertView 팝업이 나타났습니다. rootView 컨트롤러가로드를 완료 할 수있는 시간을 허용하기 위해 alertView에 대한 호출을 지연시켜 해결했습니다.

응용 프로그램에서 : didFinishLaunchingWithOptions :

[self performSelector:@selector(callPopUp) withObject:nil afterDelay:1.0];

1 초 후에 호출됩니다.

- (void)callPopUp
{
    // call UIAlertView
}

나는 같은 문제가 있었다. "처음부터"창 기반 응용 프로그램을 작성하는 경우 다음을 수행해야합니다. (이는 Xcode 4.2의 단계입니다.)

0. 애플리케이션 대리자가 UIApplicationDelegate 프로토콜을 준수하는지 확인하십시오.

예를 들어 대리인이 MyAppDelegate라고 가정합니다. MyAppDelegate.h에는 다음과 같은 내용이 있어야합니다.

@interface MyAppDelegate : 
    NSObject <UIApplicationDelegate> // etc...

1. main.m에서 응용 프로그램 위임을 지정하십시오.

예를 들어

#import "MyAppDelegate.h"

int main(int argc, char *argv[])
{
  @autoreleasepool {
    return UIApplicationMain(argc, argv,
      nil, NSStringFromClass([MyAppDelegate class]));
  }
}

2. 메인 윈도우 인터페이스 파일을 생성하십시오.

이렇게하려면 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 새 파일을 선택하십시오. 거기에서 iOS-> 사용자 인터페이스 섹션에서 창을 선택하십시오.

파일을 프로젝트에 추가 한 후 프로젝트 요약으로 이동하고 (프로젝트를 마우스 왼쪽 버튼으로 클릭하고 요약을 클릭하십시오.) iPhone / iPod 배포 정보 (및 원하는 경우 해당 iPad 섹션)에서 " 메인 인터페이스 "콤보 박스.

3. 인터페이스 편집기에서 모두 연결

파일 목록에서 인터페이스 파일을 선택하여 인터페이스 편집기를 불러옵니다.

유틸리티 창이 열려 있는지 확인하십시오.

유틸리티 창의 개체 목록에서 창 개체 아래 위의 공간으로 개체를 끌어서 새 개체를 추가하십시오. 객체를 선택하십시오. 유틸리티 창에서 신원 관리자를 클릭합니다. 클래스를 응용 프로그램의 대리자로 변경합니다 (이 예에서는 MyAppDelegate).

MyAppDelegate에 대한 연결 관리자를 불러옵니다. 인터페이스 파일에 이미 존재하는 창에 창 콘센트를 연결하십시오.

왼쪽에서 파일 소유자를 클릭 한 다음 유틸리티 창에서 ID 관리자를 클릭하십시오. 수업을 다음으로 변경UIApplication

파일 소유자의 연결 관리자를 불러옵니다. 델리게이트 콘센트를 MyAppDelegate 객체에 연결합니다.

4. 마지막으로 인터페이스 파일에서 Window 객체를 클릭하십시오. 속성 관리자를 엽니 다. "Visible at Launch"가 선택되어 있는지 확인하십시오.

그것이 나를 위해 일하기 위해해야 ​​할 전부입니다. 행운을 빕니다!


MTStatusBarOverlay를 사용하면이 오류가 발생합니다.

MTStatusBarOverlay는 루트 컨트롤러가없는 추가 창 ([[UIApplication sharedApplication] 창)을 만듭니다.

이것은 문제를 일으키지 않는 것 같습니다.


XCode 4.6.3 및 iOS 6.1을 사용하여 UI를 스토리 보드로 교체 한 후 동일한 오류가 수신되었습니다.

AppDelegate의 didFinishLaucnhingWithOptions에서 모든 코드를 지워서 해결했습니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}

OrdoDei는 정확하고 귀중한 대답을했습니다. 내 답변 didFinishLaunchingWithOptions을 사용하고 내비게이션 컨트롤러에 대한 다른 사람들의 의견을 설명 하는 방법 의 예를 제공하기 위해이 답변을 추가 하고 있습니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.

    // Instantiate the main menu view controller (UITableView with menu items).
    // Pass that view controller to the nav controller as the root of the nav stack.
    // This nav stack drives our *entire* app.
    UIViewController *viewController = [[XMMainMenuTableViewController alloc] init];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

    // Instantiate the app's window. Then get the nav controller's view into that window, and onto the screen.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // [self.window addSubview:self.navigationController.view];
    // The disabled line above was replaced by line below. Fixed Apple's complaint in log: Application windows are expected to have a root view controller at the end of application launch
    [self.window setRootViewController:self.navigationController];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

이것은 실수로 주석을 달았 기 때문에 나에게 발생했습니다.

[self.window makeKeyAndVisible];

...에서

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

xcode의 요약 화면에서 초기 뷰 컨트롤러를 설정할 수있었습니다.

왼쪽 파일 탐색기에서 가장 높은 프로젝트 이름을 클릭하십시오 (작은 청사진 아이콘이 있어야 함). 가운데 열의 'TARGETS'에서 프로젝트 이름을 클릭하십시오 (옆에 작은 연필 'A'아이콘이 있어야 함). 'iPhone / iPod 배포 정보'에서 '주 인터페이스'를 찾으십시오. 드롭 다운에서 옵션을 선택할 수 있어야합니다.


"쇼"답변 위에는 정확합니다 (UIApplicationMain의 네 번째 매개 변수는 기본 컨트롤러의 이름이어야 함).

최근에 MainWindow.xib를 사용하여 프로그래밍 방식으로 창을 구성하는 것에서 내 앱의 '모델'을 변경했습니다. 앱은 MainWindow를 자동으로 생성 한 이전 템플릿을 사용했습니다. iPhone 5 용 다른 컨트롤러보기 XIB를 지원하고 싶었으므로 App Delegate를 만들 때 프로그래밍 방식으로 올바른 XIB를 선택하는 것이 더 쉽습니다. 프로젝트에서 MainWindow.xib도 제거했습니다.

문제는 UIApplication main의 네 번째 매개 변수를 채우는 것을 잊어 버렸고 프로젝트 요약의 "Main Interface"에서 MainWindow를 제거하는 것을 잊었습니다.

이로 인해 BIG 문제가 발생했습니다. 개발 장치에서 "응용 프로그램은 다음과 같이 예상됩니다 ..."라는 무해한 경고를 표시했지만 App Store로 이동하면 MainWindow가 더 이상 번들에 없기 때문에 소비자 전화가 끊어졌습니다! 버그 수정에 대한 신속한 검토를 요청해야했습니다.

또 다른 증상은 설정을 변경하고 앱을 포 그라운드로 놓았을 때 빈 UIView와 같은 흰색 블록이 나타나는 경우가 있습니다. iPhone 5에서는 320x480 블록이라는 것이 분명했습니다. 누락 된 MainWindow가 이전 크기를 사용하여 개발 모드에서 작성되었을 수 있습니다. 충돌의 첫 번째 보고서가받은 편지함에 도달했을 때이 버그를 발견했습니다.

XCode 대신 App Store에서 앱을 설치하면 앱이 실제로 충돌하고 MainWindow 문제가 로그에 표시되어 장치 + iOS 버전의 특별한 조합이 아니라는 것을 알 수있었습니다.


Mike Flynn의 답변에 추가하려면 Xcode 7로 업그레이드하고 iOS 9 장치에서 내 앱을 실행 한 후 이것을 내 컴퓨터에 추가했습니다. (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

// Hide any window that isn't the main window
NSArray *windows = [[UIApplication sharedApplication] windows];
for (UIWindow *window in windows) {
    if (window != self.window) {
        window.hidden = YES;
    }
}

이 문제는 Interface Builder가 올바르게 설정되지 않은 경우에 발생합니다.

App Delegate의 창과 viewController 콘센트가 연결되어 있는지 확인하십시오.

MainWindow.xib에서 컨트롤을 잡고 App Delegate를 클릭하고 Window 객체로 드래그하십시오. 창을 선택하십시오. 제어권을 잡고 앱 델리게이트를 다시 선택하고 루트 뷰 컨트롤러로 끌어서 viewController를 선택하십시오.


이 오류는 MainWindow.xib 파일 소유자가 잘못 설정된 경우에도 나타납니다.

파일의 소유자는 UIApplication-
> 창 콘센트가 창에 연결된 앱 위임 클래스의 삽입 된 객체입니다.

참고 : https://stackoverflow.com/questions/7520971/applications-are-expected-to-have-a-root-view-controller-at-the-end-of-applicati



반응형