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


383

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

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

아래는 내 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에 연결됩니다.

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


5
할당 직전에 self.tabBarController의 NSLog를 수행하십시오. 컨트롤러가 nil 인 경우에만 메시지가 트리거됩니다. 그것이 정확하지 않고 연결이 올바른지 확인한 경우 코드에서 컨트롤러를 인스턴스화하십시오.
FeifanZ

창 초기화에 댓글을 달아보십시오.이 답변을 확인하십시오 stackoverflow.com/a/33958144/1293445
mohammad alabid

답변:


188

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

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

49
또 다른 옵션은 app delegate 클래스를 main으로 가져 와서 사용하도록하는 것 NSStringFromClass입니다. 이것이 Xcode가 이제 main.m 파일을 만드는 방법입니다. 예를 들면 다음 #import "AppDelegate.h과 같습니다.int retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
sho

10
다음 self.window과 같이 초기화 되었는지 확인하십시오self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor

1
위의 옵션을 시도했지만 효과가 없었습니다. 그리고 스토리 보드를 사용하지 않습니다.
jowie

3
변경 한 후에도 동일한 "응용 프로그램이 필요합니다 ..."메시지가 표시되지 않았습니다. 해결책은 OrdoDei의 답변 (위 또는 아래 참조)이 완벽하게 작동했습니다.
앤드류

1
시뮬레이터에서 흰색보기를 볼 수 있지만 스토리 보드에서 레이아웃을 볼 것으로 예상되는 경우 main.m에서 지적하고 "return 만있는 루트 위임 함수"application didFinishLaunchingWithOptions ... "에서 코드를 제거했는지 확인하십시오. 예;" 그 안에.
Olivier de Jonge

435

AppDelegate에서 교체

 [window addSubview:[someController view]];

  [self.window setRootViewController:someController];

이것은 나를 위해 메시지를 제거했습니다. 여전히 후속 창을 표시하지 않지만 다른 문제 일 수 있습니다. 감사.
Jazzmine

3
UINavigationController를 사용하는 경우 먼저 [[UINavigationController] initWithRootViewController : tableViewController] 위의 [self.window setRootViewController : self.navigationController] 위의 코드를 사용하여 창의 루트보기 컨트롤러를 설정해야합니다.
emdog4

Cocos2d는 "// AddSubView가 iOS6에서 작동하지 않습니다"라는 주석을 가지고 있습니다. 따라서 iOS 6을 사용함에 따라이 문제가 해결되었습니다.
Almo

1
addSubview라인은 초기 버전의 Xcode / iOS SDK에서 프로젝트 템플릿의 일부였습니다. 앱이 먼 길로 돌아 가면 작성하지 않아도 앱이있을 수 있습니다.
Seva Alekseyev

안녕하세요-이 멍청이가 있습니다 :-***-[UIApplication _runWithMainScene : transitionContext : completion :], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m에서 어설 션 실패 : 3294이 문제를 해결하는 방법
아카 쉬 Raghani

70

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

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

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

- (void)viewDidLoad

- (void)viewDidAppear:(BOOL)animated

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

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

행운을 빕니다!


1
Warkst, 답변 주셔서 감사합니다. 필자의 경우 코드를 viewDidLoad:플래그를 추가하지 않고 이동할 수 없으며 이를 수행해야합니다. 어쨌든 제안에 감사드립니다!
ArtSabintsev

2
오늘 이것을 발견하고 같은 문제로 viewDidLoad에서 uialert 실행을 보여준 것이 기뻤습니다. viewDidAppear로 변경되었으며 정상적으로 작동합니다. iOS5에서 이것을 변경하여 Apple이 얻는 것이 무엇인지 확실하지 않습니다.
GuybrushThreepwood

경고보기가 원인이되었다는 제안에 감사드립니다. 동일한 문제가 저에게도 발생했습니다.
Chris

1
정렬하기 위해 어떤 코드를 제거해야하는지 말씀해 주시겠습니까? viewDidLoad데이터를 추가하는 등의 모든 첫 번째 항목을 설정하여 여러 가지 용도로 사용 하고 UITableView있습니다. viewDidAppear:한 번만 발사 하기 때문에 이동할 수 없습니다 .
jowie

1
문제가 잘못된 기능이 아닙니다. 문제는 viewDidLoad 함수에서 [super viewDidLoad]를 호출하는 것을 잊어 버려서 펜촉 하중을 효과적으로 제거하는 것입니다. 같은 일이 두 번 이상 일어났습니다.
borrrden

47

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

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

...에서

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

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


이것은 나를 위해 그것을 고쳤다. CoreData를 추가하려고하는 스토리 보드와 함께 탭 응용 프로그램을 사용하고 있었고이 문제가 발생했습니다.
gitaarik

lol 이것을 추가하면 응용 프로그램 창에 루트보기 컨트롤러가 있어야한다고 경고하는 두 가지 경고가 나타납니다!
George Asda

46

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

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


2
이것은 나를 위해 일했다! 이것은 Xcode 4.2에서 빈 프로젝트를 만들 때 작동합니다. MainWindow는 없으며 여기서 어떻게 연결해야합니까?
jeevangs

실수로 우리가 'Info.plist'파일에서 'Main nib file base name'줄을 삭제했을 때 문제가 발생했습니다. 이 줄을 다시 삽입하면 문제가 해결되었습니다.
rtovars 2016 년

프로젝트 속성에서이를 설정할 수도 있습니다. 대상 프로젝트를 선택하면 요약-> iPhone / iPad 배포 정보에서이를 편집 할 수 있습니다.
doekman 2016 년

이것은 실제로 나에게 문제가되어 rootViewController에서 viewDidLoad 및 viewWillAppear를 두 번 호출하는 것과 관련된 여러 문제가 발생했습니다. 제 경우에는 이것이 해결책이었습니다
whyoz

27

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의 솔루션이 구현 된 경우에만 작동합니다.


24

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

앱에 몇 개의 창이 있고 루트 뷰 컨트롤러가 있는지 궁금합니다. 감사합니다
DrAL3X

5
참고 :이 답변은 해결 방법이며 근본 원인을 수정하지는 않습니다.
lipka

당신은 진정한 영웅입니다!
user2161301

21

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

더하다:

window.rootViewController = navigationController;

후:

[window addSubview:navigationController.view];

내 appdelegate의

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

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

영상![]

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

이것은 스토리 보드 모드에서만 발견됩니다.
ArtSabintsev

아니,이 프로젝트는 일반 펜촉 모드였습니다. 스토리 보드 모드에서 스크린 샷입니다. "실행시 표시"대 "초기 뷰 컨트롤러 임"
bearMountain

3
창 펜촉 파일을 수동으로 생성하고 기본적으로 "실행시 표시"가 선택되어 있지 않은 경우 앱 실행 후이 메시지가 표시되면 문제가 해결됩니다!
ZYiOS

오 감사합니다!!! 마지막으로,이 성가신 경고에 대한 해결책. 그래도 makeKeyAndVisible문제가 해결되지 않습니다. 이것은 나에게 경고를 해결했습니다. 감사합니다!
tacos_tacos_tacos

'이것은 스토리 보드 모드가 아닌 일반 펜촉 모드에서 발생합니다.'사실이 아닙니다. 나는과 같은 문제에 직면하고 Storyboard
thesummersign

19

iOS5 용 RootViewController를 추가하는 방법

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

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

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

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


cupsofcocoa.com 기사 링크가 죽었습니다-어딘가에 사본이 있다면 어떤 아이디어가 있습니까?
Ríomhaire

1
이것은 binpress.com으로 이동하여 답변의 링크를 업데이트했습니다.
rémy

좋은 연결입니다. 잘 읽고 무슨 일이 일어나고 있는지 설명합니다. 방금 오래된 책 (Objective-C를 먼저 배우고 싶기 때문에)을 사용 하면서이 문제가 발생했지만 최신 템플릿이없는 최신 XCode 7에서 코드를 작성합니다.
ibaralf

11

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

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

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

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


이것이 문제를 일으킬 수 있음을 확인할 수 있습니다. loadView에서 대리자를 설정하는 TableView에 대한 자습서를 따르면 동일한 상황이 발생했습니다. 해당 코드를 viewDidLoad로 이동하고 loadView를 제거한 후 모든 것이 필요에 따라 작동하기 시작했습니다.
Eugen

여전히로드 뷰를 사용할 수 있지만 [super loadView]를 추가하십시오. 처음에.
헤르만 클레 커

1
흠 ... loadView에 대한 문서에는 특히 super 메소드를 호출해서는 안된다고 명시되어 있습니다.
Joshua Sullivan

스토리 보드의 기본 UIViewController를 무시하고 UIViewController 하위 클래스를 만들기위한 템플릿 코드에 기본적으로 loadView가 활성화되어 나를 위해이를 발견했습니다 ...이 바보 같은 일에서 1 시간 이상 낭비되었습니다. 이것을 게시 해 주셔서 감사합니다!
slycrel

11

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

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

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


코드 : "self.window = [[UIWindow alloc] initWithFrame : [[UIScreen mainScreen] 범위]];" 오류가 발생하여 방금 삭제했습니다.
Grigori A.

11

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

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

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


많은 kudos, 이것은 내가 원하는 것입니다 (스토리 보드가있는 빈 프로젝트)
Shtirlic

2
여기도 마찬가지입니다. 감사. 빈 응용 프로그램을 만드는 경우이 방법은 창의 수동 생성으로 채워집니다. 단순히 YES를 반환하도록 변경해야합니다. Thx
Ben G

10

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

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

App Delegate 메소드에서 :

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

효과가있었습니다.


10

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
}

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


9

탭 막대 컨트롤러의 IBOutlet을 Interface Builder의 루트보기에 연결하십시오.

self.window.rootViewController = self.tabBarController;

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


8

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

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

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


8

나는 같은 문제를 겪었지만 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;
}

이 문제를 해결했습니다.


7

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

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

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

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

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

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


바로 내 문제였습니다! loadView 구현을 추가했지만 super를 호출하지 않았습니다. 다른 코드가 변경되었으므로 내가 한 일을 기억하지 못했습니다. 그 변화가 무해한 것처럼 보였기 때문에 2 시간 동안 붙어있었습니다.
LearnCocos2D

6

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

응용 프로그램에서 : didFinishLaunchingWithOptions :

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

1 초 후 호출 :

- (void)callPopUp
{
    // call UIAlertView
}

고마워, 이것은 내 문제를 해결했다. 창이로드 될 때까지 경고가 표시 될 때까지 기다려야합니다. 내 경우에는 방금 [alert performSelector : @selector (show) withObject : nil afterDelay : 1.0];
deepwinter

6

나는 같은 문제가 있었다. "처음부터"창 기반 응용 프로그램을 작성하는 경우 다음을 수행해야합니다. (이는 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. 인터페이스 편집기에서 모두 연결

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

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

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

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

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

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

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

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


6

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

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

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


확실합니까? 테스트 했습니까?
Sergey Grischyov

창을 생성한다고 확신하며 앱에서 문제를 일으키지 않을 것이라고 확신합니다.
혼란스러운 볼론

더미 VC를 MTStatusBarOverlay로 설정하여 수정할 수 있습니다.
웨슬리

이것은 정확히 내 문제였습니다. 알림 표시 줄에 추가 된 창을 사용하여 비슷한 종류의 설정을했고 오류가 사라 졌다고 언급하면! 이 경우 무해한 것 같습니다.
Aaron Zinman

6

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

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

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

5

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

4

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

[self.window makeKeyAndVisible];

...에서

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

4

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

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


4

"쇼"답변 위에는 맞습니다 (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 버전의 특별한 조합이 아니라는 것을 알 수있었습니다.


4

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

앱에 몇 개의 창이 있고 루트 뷰 컨트롤러가 있는지 궁금합니다. 감사합니다
DrAL3X

3

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

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

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


3

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

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


xib 파일을 수동으로 만들고이 오류가 발생하기 시작했습니다. 무리 감사!
RawMean
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.