แอปพลิเคชันคาดว่าจะมีตัวควบคุมรูทวิวเมื่อสิ้นสุดการเปิดตัวแอปพลิเคชัน


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

ในเครื่องมือสร้างอินเทอร์เฟซUITabBarControllerผู้รับมอบสิทธิ์จะถูกเชื่อมโยงกับตัวแทนแอป

ใครรู้วิธีแก้ไขปัญหานี้


5
ทำ NSLog ของ self.tabBarController ก่อนที่จะทำการมอบหมาย ข้อความจะถูกทริกเกอร์เฉพาะในกรณีที่ตัวควบคุมเป็นศูนย์ ถ้ามันเป็นศูนย์และคุณแน่ใจว่าการเชื่อมต่อของคุณถูกต้องลอง instantiating ตัวควบคุมในรหัส
FeifanZ

พยายามที่จะแสดงความคิดเห็นการเริ่มต้นของหน้าต่าง .. ตรวจสอบคำตอบนี้ stackoverflow.com/a/33958144/1293445
mohammad alabid

คำตอบ:


188

ฉันมีปัญหาเดียวกันนี้ ตรวจสอบเมนของคุณ อาร์กิวเมนต์สุดท้ายควรถูกตั้งค่าเป็นชื่อของคลาสที่ใช้โปรโตคอล UIApplicationDelegate

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

49
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
หากคุณเห็นมุมมองสีขาวในเครื่องมือจำลอง แต่คาดว่าจะเห็นเลย์เอาต์จากกระดานเรื่องราวให้แน่ใจว่าคุณได้ลบรหัสในฟังก์ชันรูทของผู้รับมอบสิทธิ์ "แอปพลิเคชัน didFinishLaunchingWithOptions ... " ซึ่งชี้ไปที่ main.m ใช่;" ในนั้น.
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: complete:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 วิธีแก้ปัญหานี้
Akash Raghani

70

ฉันมีข้อผิดพลาดเดียวกันเมื่อพยายามเปลี่ยนคอนโทรลเลอร์มุมมองแรกที่โหลด

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

ตอนแรกฉันไม่รู้จริงๆว่าข้อผิดพลาดมาจากอะไรฉันจึง จำกัด ให้แคบลงและพบว่ามีอะไรผิดพลาด ปรากฎว่าฉันพยายามที่จะเปลี่ยนการแสดงผลของมุมมองก่อนที่มันจะมาบนหน้าจอจริง วิธีแก้ปัญหาคือการย้ายรหัสนี้ใน viewcontroller ที่ทำให้ฉันมีปัญหา

- (void)viewDidLoad

ถึง

- (void)viewDidAppear:(BOOL)animated

และข้อผิดพลาดหยุดปรากฏขึ้น ปัญหาของฉันเกิดจากการUIAlertViewแสดง

ในกรณีของคุณฉันแนะนำให้คุณตรวจสอบรหัสใน tabBarController ของ view view controller (เพราะมันอาจเป็นปัญหาใน view controller นั้น) หากวิธีนี้ไม่ได้ผลให้ลองตั้งค่าการตั้งค่าเริ่มต้นในไฟล์ปลายปากกาแทนเป็นรหัส - หรือหากคุณต้องการทำในรหัสลองย้ายรหัสไปยังแท็บวิธีการที่เหมาะสมของตัวควบคุม viewBlue ของ tabBarController

โชคดี!


1
ขอขอบคุณสำหรับคำตอบ ในกรณีของฉันฉันไม่สามารถย้ายรหัสออกจากviewDidLoad:(โดยไม่เพิ่มการตั้งค่าสถานะ) และไม่ควรทำเช่นนี้ ขอบคุณสำหรับคำแนะนำ!
ArtSabintsev

2
พบสิ่งนี้ในวันนี้และดีใจที่ฉันทำ - ฉบับเดียวกัน - กำลังแสดงการเปิดตัว uialert ใน viewDidLoad เปลี่ยนเป็น viewAppear และใช้งานได้ดี ไม่แน่ใจว่าแอปเปิ้ลที่ดีกว่าจะประสบความสำเร็จโดยการเปลี่ยนแปลงสิ่งนี้ใน iOS5
GuybrushThreepwood

ขอบคุณสำหรับคำแนะนำว่ามุมมองการแจ้งเตือนทำให้เกิดปัญหาเดียวกันกับฉันเช่นกัน
Chris

1
คุณช่วยบอกเราได้ไหมว่าคุณต้องลบโค้ดอะไรบ้างเพื่อจัดเรียง ฉันใช้ของฉันviewDidLoadในหลาย ๆ UITableViewเรื่องการตั้งค่าทุกสิ่งที่เป็นครั้งแรกเช่นการเพิ่มข้อมูลไปยัง ฉันไม่สามารถย้ายไปที่viewDidAppear:เพราะฉันต้องการที่จะยิงเพียงครั้งเดียว
jowie

1
ปัญหาไม่ใช่ฟังก์ชั่นที่ผิด ปัญหาคือคุณลืมที่จะโทรหา [super viewDidLoad] ในฟังก์ชั่น viewDidLoad ของคุณเพื่อฆ่า nib load อย่างมีประสิทธิภาพ สิ่งเดียวกันได้เกิดขึ้นกับฉันมากกว่าหนึ่งครั้ง
borrrden

47

ฉันได้สิ่งนี้เมื่อเริ่มต้นด้วยเทมเพลต "แอปพลิเคชันที่ว่างเปล่า" จากนั้นเพิ่ม XIB ด้วยตนเอง ฉันแก้ไขมันโดยการตั้งชื่อ Nib หลักตามที่ Sunny แนะนำ ขั้นตอนที่ขาดหายไปในสถานการณ์นี้คือการลบ

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

จาก

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

เนื่องจากมันจะเขียนทับอินสแตนซ์ของหน้าต่างของคุณที่สร้างขึ้นในไฟล์ Xib นี่คือสมมติว่าคุณได้สร้าง ViewController และต่อสายเข้ากับหน้าต่างของคุณและผู้แทนแอพในไฟล์ XIB เช่นกัน


การแก้ไขนี้สำหรับฉันด้วย ฉันใช้แอพพลิเคชั่นแบบแท็บด้วยสตอรี่บอร์ดซึ่งฉันพยายามเพิ่ม CoreData ลงและพบปัญหานี้
gitaarik

ฮ่า ๆ ถ้าฉันเพิ่มสิ่งนี้ฉันจะได้รับสองคำเตือนว่าแอพพลิเคชั่น windows คาดว่าจะมีตัวควบคุมรูทวิว !!
George Asda

46

เรื่องนี้เกิดขึ้นกับฉัน แก้ไขได้โดยการแก้ไขไฟล์. plist ระบุชื่อฐานไฟล์ nib หลัก (ควรเป็น MainWindow.xib) หวังว่าจะช่วยได้

enter image description here


2
สิ่งนี้ได้ผลสำหรับฉัน! ใช้งานได้เมื่อคุณสร้างโครงการเปล่าใน Xcode 4.2 ซึ่งไม่มี MainWindow ปรากฏอยู่และนี่คือวิธีที่เราต้องเชื่อมโยงมันเข้าด้วยกัน
jeevangs

ปัญหาสำหรับเราเกิดขึ้นเมื่อเราลบบรรทัด 'Main nib file base name' โดยไม่ตั้งใจออกจากไฟล์ 'Info.plist' การแทรกบรรทัดนี้อีกครั้งเพื่อแก้ไขปัญหา
rtovars

คุณยังสามารถตั้งค่านี้ในคุณสมบัติโครงการ เลือกโครงการเป้าหมายของคุณคุณสามารถแก้ไขได้ในสรุป -> ข้อมูลการปรับใช้ iPhone / iPad
doekman

นี่เป็นปัญหาสำหรับฉันจริง ๆ แล้วนำไปสู่ปัญหาต่าง ๆ ที่เกี่ยวกับการเรียก viewDidLoad และ viewWillAppear สองครั้งบน rootViewController ในกรณีของฉันการลบนี่เป็นวิธีแก้ปัญหา
เพราะเหตุใด

27

ฉันพบปัญหาเดียวกันเมื่อเร็ว ๆ นี้เมื่อสร้างโครงการด้วย ios5 sdk ตอนแรกมันกำลังสร้างและทำงานอย่างถูกต้อง แต่หลังจากนั้นข้อผิดพลาดก็ปรากฏขึ้น
ในกรณีของฉันการแก้ปัญหาค่อนข้างง่าย
สิ่งที่ขาดหายไปคืออินเทอร์เฟซหลักคุณสมบัติในแท็บสรุปของเป้าหมายแอปพลิเคชันของฉันถูกลบ ดังนั้นฉันจำเป็นต้องตั้งค่าอีกครั้ง


หากนี่ไม่ใช่จุดและถ้า tabBarController ยังคงเป็นศูนย์คุณสามารถสร้างหน้าต่างและรูทคอนโทรลเลอร์ของคุณได้โดยทางโปรแกรม ในฐานะทางเลือกฉันเพิ่มรหัสต่อไปนี้ในโครงการของฉัน

- (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
หมายเหตุ : คำตอบนี้เป็นวิธีแก้ปัญหาและไม่แก้ไขสาเหตุที่แท้จริง ดูstackoverflow.com/a/33958144/1116061
lipka

คุณเป็นฮีโร่ตัวจริง!
user2161301

21

คำแนะนำข้างต้นไม่สามารถแก้ไขปัญหาของฉันได้ ของฉันเป็นแบบนี้:

เพิ่ม:

window.rootViewController = navigationController;

หลังจาก:

[window addSubview:navigationController.view];

ใน appdelegate ของฉัน

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

20
  • เลือก "หน้าต่าง" ของคุณในไฟล์ปลายปากกา
  • ใน "แอตทริบิวต์ผู้ตรวจสอบ" ตรวจสอบ "มองเห็นได้ที่เปิดตัว"

ภาพ![]

  • สิ่งนี้จะเกิดขึ้นเมื่อไฟล์ปลายปากกาของคุณสร้างขึ้นด้วยตนเอง
  • การแก้ไขนี้ใช้งานได้สำหรับโหมดปลายปากกาปกติ - ไม่ใช่โหมดกระดานเรื่องราว

ฉันพบเฉพาะในโหมด Storyboard เท่านั้นฉันคิดว่า
ArtSabintsev

ไม่โครงการนี้เป็นโหมดปากกาปกติ นี่คือภาพหน้าจอจาก Storyboard Mode "มองเห็นได้เมื่อเปิดตัว" เทียบกับ "Is Initial View Controller"
bearMountain

3
หากไฟล์ปลายปากกาหน้าต่างสร้างขึ้นด้วยตนเองและ "ไม่ปรากฏที่เปิดใช้" โดยค่าเริ่มต้นจะแสดงข้อความนี้หลังจากเปิดใช้แอปแล้วนี่เป็นการแก้ไขปัญหาของฉัน!
ZYiOS

โอ้ขอบคุณ!!! ในที่สุดการแก้ปัญหาคำเตือนที่น่ารำคาญนี้ แม้ว่าคุณจะมีmakeKeyAndVisibleมันไม่สามารถแก้ไขปัญหาได้ เพียงแค่นี้แก้ไขคำเตือนสำหรับฉัน ขอบคุณ!
tacos_tacos_tacos

'สิ่งนี้เกิดขึ้นในโหมดปลายปากกาปกติไม่ใช่โหมดสตอรีบอร์ด' ไม่จริงมาก ฉันกำลังหันหน้าไปทางปัญหาเดียวกันกับStoryboardยัง
thesummersign

19

วิธีเพิ่ม RootViewController สำหรับ iOS5

หากแอปของคุณไม่ได้ใช้ 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

ฉันยังมีข้อผิดพลาดนี้ แต่ไม่เหมือนคำตอบที่ฉันระบุไว้ก่อนหน้านี้เนื่องจากฉันไม่ได้แสดงข้อคิดเห็นวิธี 'loadView' ในตัวควบคุมที่สร้างขึ้นใหม่ของฉัน (xcode 4.2, ios5)

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

มันบอกฉันด้วยว่าวิธีนี้ใช้สำหรับสร้างมุมมองโดยทางโปรแกรม แต่ฉันพลาดไปเพราะมันดูคล้ายกับวิธีอื่น ๆ เช่น viewDidLoad ที่ปกติฉันใช้ฉันไม่ได้จับมัน

ในการแก้เพียงแค่เอาวิธีการนั้นออกหากคุณไม่ได้สร้างลำดับชั้นของมุมมองโดยทางโปรแกรมโดยใช้ปลายปากกาหรือกระดานเรื่องราว


ฉันสามารถยืนยันได้ว่านี่อาจทำให้เกิดปัญหา ฉันมีสถานการณ์เดียวกันโดยทำตามบทช่วยสอนเกี่ยวกับ TableView ที่พวกเขาสร้างชุดผู้รับมอบสิทธิ์ใน loadView หลังจากย้ายโค้ดนั้นไปที่ viewDidLoad และลบ loadView ทุกอย่างก็เริ่มทำงานได้ตามต้องการ
Eugen

คุณยังสามารถใช้ประโยชน์จากมุมมองโหลด แต่เพิ่ม [super loadView]; ที่จุดเริ่มต้น
Hermann Klecker

1
อืม ... เอกสารประกอบสำหรับ loadView ระบุไว้เป็นพิเศษว่าคุณไม่ควรเรียกใช้วิธีการ super
Joshua Sullivan

ฉันลบล้างค่าเริ่มต้นของ UIViewController ในสตอรี่บอร์ดและพบว่ารหัสเทมเพลตสำหรับการสร้างคลาสย่อยของ UIViewController นั้นเปิดใช้งาน loadView โดยค่าเริ่มต้นทำให้เกิดสิ่งนี้สำหรับฉัน ... เสียเวลากว่าหนึ่งชั่วโมงกับเรื่องโง่ ๆ ขอบคุณสำหรับการโพสต์นี้!
slycrel

11

ฉันได้รับปัญหานี้ด้วย ฉันทำให้โปรเจคของฉันทำงานใน xcode4.2.1 ฉันได้อ่านความคิดเห็นทั้งหมดที่นั่น แต่ไม่มีใครเจ๋งสำหรับฉัน หลังจากนั้นไม่นานฉันพบว่าฉันแสดงความคิดเห็นชิ้นส่วนของรหัส

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

จากนั้นฉันก็ไม่ใส่เครื่องหมายข้อคิดเห็นมัน ทุกอย่างก็โอเคสำหรับฉัน หวังว่านี่จะเป็นประโยชน์สำหรับพวกคุณ


รหัส: "self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] ขอบเขต]];" ทำให้เกิดข้อผิดพลาดดังนั้นฉันเพิ่งลบมัน
กริกอรี่ A.

11

ตรวจสอบให้แน่ใจว่าคุณมีฟังก์ชั่นนี้ในแอปพลิเคชันของคุณ

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

ตรวจสอบให้แน่ใจว่า FinishLaunchingWithOptions ได้รับผลตอบแทน YES หากคุณลบบรรทัด 'return YES' ออกจะทำให้เกิดข้อผิดพลาด ข้อผิดพลาดนี้อาจพบได้ทั่วไปกับผู้ใช้กระดานเรื่องราว


ความรุ่งโรจน์จำนวนมากนี่คือสิ่งที่ฉันต้องการ (โครงการที่ว่างเปล่ากับกระดานเรื่องราว)
Shtirlic

2
กันที่นี่ ขอบคุณ หากคุณสร้างแอปพลิเคชั่นที่ว่างเปล่าวิธีการนี้จะเต็มไปด้วยการสร้างหน้าต่างด้วยตนเอง สิ่งนี้ควรเปลี่ยนเพื่อคืนค่า YES ขอบคุณ
Ben G

10

ด้วยมุมมองแรกของฉันที่ฉันถูกMenuViewControllerเพิ่ม:

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

ในวิธีการมอบสิทธิ์แทนแอป:

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

ที่ได้ผล


10

มีการเปลี่ยนแปลงเล็กน้อยรอบ iOS 5.0 หรือมากกว่านั้นทำให้คุณต้องมีตัวควบคุมรูทวิว หากรหัสของคุณอ้างอิงจากรหัสตัวอย่างรุ่นเก่าเช่นGLES2Sampleจะไม่มีการสร้างตัวควบคุมมุมมองรูทในตัวอย่างโค้ดเหล่านั้น

ในการแก้ไข (ตัวอย่างเช่น GLES2 ตัวอย่าง) 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 ของตัวควบคุมแถบแท็บกับรูทวิวในเครื่องมือสร้างอินเทอร์เฟซแทน

self.window.rootViewController = self.tabBarController;

แต่จริงๆแล้วฉันไม่เคยเห็นข้อผิดพลาดดังกล่าวมาก่อน


8

ฉันแก้ไขปัญหาโดยทำสิ่งต่อไปนี้ (ไม่มีวิธีแก้ไขปัญหาอื่นใดด้านบนช่วย):

จากเมนูแบบเลื่อนลงที่เชื่อมโยงกับ "อินเทอร์เฟซหลัก" ให้เลือกรายการอื่นแล้วเลือก "MainWindow" อีกครั้งจากนั้นสร้างใหม่

ป้อนคำอธิบายรูปภาพที่นี่


8

ฉันเจอปัญหาเดียวกัน แต่ใช้อยู่ storyboard

การกำหนดของฉันไปยังหน้าต่างของฉันstoryboard InitialViewControllerrootViewController

ใน

- (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 แล้วสร้างไฟล์ปลายปากกาแยกต่างหาก)

หลังจากใส่ทุกบรรทัดที่ฉันใช้และทำให้แน่ใจว่าฉันมีการเชื่อมต่อที่ถูกต้องฉันได้รับข้อผิดพลาดนั้นและไฟล์ปลายปากกาที่ฉันพยายามโหลดผ่านตัวควบคุมมุมมอง (ซึ่งถูกตั้งค่าเป็น rootController) ไม่เคยแสดงในโปรแกรมจำลอง

ฉันสร้างเทมเพลตมุมมองเดียวผ่าน Xcode และเปรียบเทียบกับรหัสของฉันและในที่สุดก็พบปัญหา!

Xcode 4.3 จะปรากฏขึ้นเพื่อเพิ่มตามค่าเริ่มต้นวิธี - (เป็นโมฆะ) loadView; ไปยังส่วนการใช้งานตัวควบคุมมุมมอง หลังจากอ่านความคิดเห็นอย่างถี่ถ้วนแล้วมันก็ชัดเจนว่าปัญหาคืออะไร ความคิดเห็นที่ระบุเพื่อแทนที่เมธอด loadView หากสร้างมุมมองโดยทางโปรแกรม (และฉันกำลังถอดความ) มิฉะนั้นจะไม่แทนที่ overview loadView หากใช้ nib ไม่มีสิ่งอื่นใดในวิธีนี้ดังนั้นฉันจึงมีอิทธิพลเหนือวิธีการ (และไม่ทำอะไรเลย) ในขณะที่ใช้ไฟล์ปลายปากกาซึ่งทำให้เกิดข้อผิดพลาด

โซลูชันจะลบวิธีการ loadView อย่างสมบูรณ์จากส่วนการนำไปใช้หรือเพื่อเรียกวิธีหลักโดยเพิ่ม [super loadView]

การลบออกจะเป็นการดีที่สุดหากใช้ไฟล์ NIB เนื่องจากการเพิ่มโค้ดอื่นใดจะมีผลลบล้างไฟล์นั้น


นั่นคือปัญหาของฉัน! ฉันได้เพิ่มการใช้งาน loadView แต่ไม่ได้เรียกว่า super ทำการเปลี่ยนแปลงรหัสอื่น ๆ ไม่สามารถจำสิ่งที่ฉันทำ ให้ฉันติดอยู่ 2 ชั่วโมงเพราะการเปลี่ยนแปลงนั้นดูไร้พิษภัย
LearnCocos2D

6

ฉันมีข้อความแสดงข้อผิดพลาดเดียวกันนี้ในบันทึก ฉันมีป๊อปอัพ UIAlertView ปรากฏอยู่ในแอปพลิเคชัน: ได้ FinishLaunchingWithOptions ฉันแก้ไขได้โดยชะลอการเรียกไปที่ alertView เพื่อให้เวลาสำหรับตัวควบคุมรูทดูเพื่อให้การโหลดเสร็จสิ้น

ในแอปพลิเคชัน: ไม่เสร็จสิ้นการเปิดใช้งานด้วย:

[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 -> User Interface

หลังจากเพิ่มไฟล์ลงในโครงการของคุณไปที่บทสรุปของโครงการ (คลิกซ้ายที่โครงการ; คลิกสรุป) ภายใต้ข้อมูลการปรับใช้ iPhone / iPod (และส่วน iPad ที่เกี่ยวข้องหากคุณต้องการ) และเลือกไฟล์อินเตอร์เฟสใหม่ของคุณใน " อินเทอร์เฟซหลัก "กล่องคำสั่งผสม

3. เชื่อมต่อทั้งหมดเข้ากับเครื่องมือแก้ไขส่วนต่อประสาน

เลือกไฟล์อินเตอร์เฟสของคุณในรายการไฟล์เพื่อเรียกใช้ตัวแก้ไขอินเตอร์เฟส

ตรวจสอบให้แน่ใจว่าบานหน้าต่าง Utilities เปิดอยู่

เพิ่มวัตถุใหม่โดยการลากวัตถุจากรายการวัตถุในบานหน้าต่างโปรแกรมอรรถประโยชน์ไปยังพื้นที่ด้านบนของวัตถุหน้าต่างด้านล่างของคุณ เลือกวัตถุ คลิกที่ตัวตรวจสอบตัวตนในบานหน้าต่างยูทิลิตี้ เปลี่ยนคลาสเป็นตัวแทนของแอปพลิเคชัน (MyAppDelegate ในตัวอย่างนี้)

นำผู้ตรวจสอบการเชื่อมต่อสำหรับ MyAppDelegate ขึ้นมา เชื่อมต่อช่องหน้าต่างเข้ากับหน้าต่างที่มีอยู่แล้วในไฟล์อินเตอร์เฟส

คลิกที่เจ้าของไฟล์ทางด้านซ้ายแล้วคลิกตัวตรวจสอบตัวตนในบานหน้าต่างยูทิลิตี้ เปลี่ยนคลาสเป็นUIApplication

เรียกใช้ตัวตรวจสอบการเชื่อมต่อสำหรับเจ้าของไฟล์ เชื่อมต่อตัวแทนผู้รับมอบสิทธิ์ไปยังวัตถุ MyAppDelegate

4. ในที่สุดและที่สำคัญคลิกที่วัตถุหน้าต่างในไฟล์อินเตอร์เฟส เปิดตัวตรวจสอบคุณสมบัติ ตรวจสอบให้แน่ใจว่าได้เลือก "Visible at Launch"

นั่นคือทั้งหมดที่ฉันต้องทำเพื่อให้มันได้ผลสำหรับฉัน โชคดี!


6

หากคุณใช้ MTStatusBarOverlay คุณจะได้รับข้อผิดพลาดนี้

MTStatusBarOverlay สร้างหน้าต่างเพิ่มเติม ([[UIApplication sharedApplication] windows) ซึ่งไม่มีตัวควบคุมรูท

ดูเหมือนจะไม่ก่อให้เกิดปัญหา


คุณแน่ใจเหรอ คุณทดสอบแล้วหรือยัง
Sergey Grischyov

ฉันแน่ใจว่ามันสร้างหน้าต่าง & ฉันแน่ใจว่ามันจะไม่สร้างปัญหาในแอปของฉัน
Vorlon ที่สับสน

คุณสามารถตั้งค่า dummy VC เป็น MTStatusBarOverlay เพื่อแก้ไข
Wesley

นี่เป็นปัญหาของฉันอย่างแน่นอน ฉันมีการตั้งค่าแบบเดียวกันกับหน้าต่างที่เพิ่มสำหรับแถบการแจ้งเตือนและเมื่อฉันแสดงความคิดเห็นว่าข้อผิดพลาดหายไป! ดูเหมือนว่าจะไม่เป็นอันตรายในกรณีนี้
Aaron Zinman

6

ได้รับข้อผิดพลาดเดียวกันหลังจากแทนที่ UI ของฉันด้วย Storyboard โดยใช้ XCode 4.6.3 และ iOS 6.1

แก้ไขได้โดยการล้างรหัสทั้งหมดจาก didFinishLaucnhingWithOptions ใน AppDelegate

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

5

OrdoDei ให้คำตอบที่ถูกต้องและมีคุณค่า ฉันกำลังเพิ่มคำตอบนี้เพียงเพื่อให้ตัวอย่างของdidFinishLaunchingWithOptionsวิธีการที่ใช้คำตอบของเขาเช่นเดียวกับการบัญชีสำหรับความคิดเห็นของผู้อื่นเกี่ยวกับ Navigation Controller

- (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

คลิกที่ชื่อโปรเจ็กต์ด้านบนสุดใน explorer ไฟล์ด้านซ้าย (ควรมีไอคอนพิมพ์เขียวเล็กน้อย) ในคอลัมน์กลางคลิกที่ชื่อโครงการของคุณภายใต้ 'เป้าหมาย' (ควรมีไอคอน 'A' ดินสอเล็ก ๆ ติดกับมัน) ดูภายใต้ 'ข้อมูลการปรับใช้ iPhone / iPod' และค้นหา 'อินเทอร์เฟซหลัก' คุณควรเลือกตัวเลือกจากรายการแบบหล่นลง


4

ด้านบนของคำตอบ "sho" ที่ถูกต้อง (พารามิเตอร์ที่สี่ของ UIApplicationMain ควรเป็นชื่อของตัวควบคุมหลัก) ฉันเพิ่มความคิดเห็น

ฉันเพิ่งเปลี่ยน 'รุ่น' ของแอพของฉันจากการใช้ MainWindow.xib เพื่อสร้างหน้าต่างแบบเป็นโปรแกรม แอปใช้เทมเพลตที่เก่ากว่าที่สร้าง MainWindow โดยอัตโนมัติ เนื่องจากฉันต้องการสนับสนุน XIB ของมุมมองคอนโทรลเลอร์ที่แตกต่างกันสำหรับ iPhone 5 มันง่ายกว่าที่จะเลือก XIB ที่เหมาะสมโดยทางโปรแกรมเมื่อสร้างแอพ Delegate ขึ้นมา ฉันลบ MainWindow.xib ออกจากโครงการด้วย

ปัญหาคือฉันลืมกรอกพารามิเตอร์ที่สี่ใน main UIApplication และฉันลืมเอา MainWindow จาก "Main Interface" ที่ Project Summary

สิ่งนี้ทำให้เกิดปัญหาใหญ่: มันแสดงคำเตือนที่ไม่เป็นอันตราย "แอปพลิเคชันที่คาดว่าจะ ... " ในอุปกรณ์การพัฒนา แต่เมื่อมันไปที่ App Store มันบุกเข้ามาในโทรศัพท์ของผู้บริโภค ฉันต้องขอตรวจสอบอย่างเร่งด่วนสำหรับการแก้ไขข้อบกพร่อง

อาการอีกอย่างหนึ่งก็คือบางครั้งบล็อกสีขาวเช่น UIView เปล่าบางครั้งก็ปรากฏขึ้นเมื่อมีการเปลี่ยนแปลงการตั้งค่าและแอพถูกวางไว้เบื้องหน้า ใน iPhone 5 เป็นที่ชัดเจนว่าเป็นบล็อกขนาด 320x480 บางที MainWindow ที่ขาดหายไปอาจถูกสร้างขึ้นในโหมดการพัฒนาโดยใช้ขนาดเก่า ฉันเพิ่งพบข้อผิดพลาดนี้เมื่อรายงานข้อผิดพลาดครั้งแรกมาถึงกล่องจดหมาย

การติดตั้งแอพจาก App Store แทนจาก XCode แสดงให้เห็นว่าแอพขัดข้องอย่างแท้จริงและปัญหา 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

ปัญหานี้เกิดขึ้นเมื่อคุณไม่ได้ตั้งค่าเครื่องมือสร้างอินเทอร์เฟซอย่างถูกต้อง

ตรวจสอบให้แน่ใจว่าหน้าต่างของผู้แทนแอปและร้าน viewController ของคุณเชื่อมต่อกันแล้ว:

ใน MainWindow.xib ของคุณกดปุ่ม control ค้างไว้คลิก App Delegate และลากไปที่วัตถุ Window เลือกหน้าต่าง กดปุ่ม Control ค้างไว้แล้วเลือกตัวแทนแอพอีกครั้งแล้วลากไปที่รูทดูคอนโทรลเลอร์ของคุณแล้วเลือก viewController


3

ข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อเจ้าของไฟล์ MainWindow.xib ตั้งค่าไม่ถูกต้อง

เจ้าของไฟล์คือ UIApplication
-> แทรกวัตถุของคลาสผู้รับมอบสิทธิ์แอพที่มีช่องหน้าต่างที่เชื่อมต่อกับหน้าต่าง


ฉันสร้างไฟล์ xib ด้วยตนเองและเริ่มได้รับข้อผิดพลาดนี้ ขอบคุณมัด!
RawMean
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.