init root viewcontroller ทำให้เกิดความผิดพลาด

ฉันใช้รหัสด้านล่างเพื่อเริ่มต้นตัวควบคุมรูทวิว

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

{

[window addSubview:rootViewController.view];
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController: rootViewController  ];
}

มันทำงานได้ดีบน iOS 4 ประมาณ 2 ปี, iOS5 1 ปี ไม่มีปัญหาใดๆ เมื่อเริ่มเรียกใช้แอป แต่บน iOS6 มันขัดข้องและรายงาน

* การยกเลิกแอปเนื่องจากข้อยกเว้นที่ไม่ถูกตรวจจับ 'UIViewControllerHierarchyInconsistency' เหตุผล: 'การเพิ่มตัวควบคุมรูทวิวเป็นลูกของตัวควบคุมมุมมอง:'

ยินดีรับฟังความคิดเห็นใดๆ


person arachide    schedule 27.09.2012    source แหล่งที่มา
comment
rootViewController ของคุณเป็นลูกของ viewController อื่นอยู่แล้วหรือไม่ หรือเป็น rootViewController บนหน้าต่าง?   -  person iSofTom    schedule 27.09.2012


คำตอบ (2)


'rootViewController' อยู่ในลำดับชั้นการดูของคุณแล้ว ลบออกจากคอนเทนเนอร์อื่น ๆ ที่อยู่ใน (window.rootViewController ?) ก่อน (window.rootViewController = nil)

person David H    schedule 27.09.2012
comment
คำถามที่เกี่ยวข้องบ้าง: การเรียก UINavigationController-init ถูกกฎหมายหรือฉันต้องโทร -initWithRootViewController:? หากอย่างหลัง ถือว่าผ่านศูนย์เลยหรือไม่? - person nmr; 21.10.2012
comment
Apple กล่าวว่าควรเลือกใช้ตัวเริ่มต้นที่ต้องการ อย่างไรก็ตาม ใครๆ ก็สามารถจินตนาการได้ว่ามันเพิ่งตั้งค่ารูทคอนโทรลเลอร์ ดังนั้นการใช้เมธอด 'initWithFrame' จากนั้นตั้งค่าคุณสมบัติก็อาจเป็นไปได้ แต่ถามตัวเองว่าทำไมถึงทำอย่างนั้น? เมื่อคุณหลงจากเส้น คุณจะเพิ่มโอกาสที่จะเกิดปัญหาในอนาคต แอพของฉันถูก iOS6 บิตสองครั้งเนื่องจากการหลงทางเล็กน้อย YMMV. - person David H; 21.10.2012

ในโค้ดของคุณ คุณกำลังเพิ่มมุมมองของ rootViewController ไปที่หน้าต่าง จากนั้นพยายามเพิ่มมุมมองของ rootViewController ไปยัง UINavigationController ใหม่ทันที ลองทำสิ่งนี้แทน:

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

    ...    

    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    [window addSubview:nav.view];

    ...
}

หรือดีกว่านั้น:

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

    ...    

    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    window.rootViewController = nav;

    ...
}

... อยู่ที่นั่นเพื่อแสดงให้เห็นว่าสิ่งเหล่านี้เป็นตัวอย่างที่ไม่สมบูรณ์ของ -application:didFinishLaunchingWithOptions: คุณต้องตรวจสอบให้แน่ใจว่าคุณได้รวมการสร้าง UIWindow ของคุณและเรียก -makeKeyAndVisible ด้วย

person Adam Swinden    schedule 27.09.2012