init root viewcontroller menyebabkan kerusakan

Saya menggunakan kode di bawah ini untuk memulai pengontrol tampilan root

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

{

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

itu bekerja dengan baik di ios 4 sekitar 2 tahun, ios5 1 tahun, tidak ada masalah ketika mulai menjalankan aplikasi tetapi di ios6 crash dan dilaporkan

* Menghentikan aplikasi karena pengecualian yang tidak tertangkap 'UIViewControllerHierarchyInconsistency', alasan: 'menambahkan pengontrol tampilan root sebagai anak pengontrol tampilan:'

Selamat datang komentar apa pun


person arachide    schedule 27.09.2012    source sumber
comment
Apakah rootViewController Anda sudah menjadi turunan dari viewController lain? atau apakah itu rootViewController di jendela?   -  person iSofTom    schedule 27.09.2012


Jawaban (2)


'rootViewController' sudah ada dalam hierarki tampilan Anda. Hapus dari wadah lain apa pun yang ada di dalamnya (window.rootViewController ?) terlebih dahulu (window.rootViewController = nihil).

person David H    schedule 27.09.2012
comment
Pertanyaan yang agak terkait: apakah memanggil UINavigationController-init sah, atau apakah saya harus memanggil -initWithRootViewController:? Jika yang terakhir, apakah sah untuk memberikan nihil? - person nmr; 21.10.2012
comment
Apple mengatakan penginisialisasi pilihan harus diutamakan. Namun dapat dibayangkan bahwa ini hanya menyetel pengontrol root, jadi mungkin boleh saja menggunakan metode 'initWithFrame' lalu menyetel propertinya. Tapi kemudian tanyakan pada diri Anda mengapa melakukan itu? Ketika Anda menyimpang dari garis, Anda meningkatkan kemungkinan masalah di masa depan. Aplikasi saya digigit dua kali oleh iOS6 karena sedikit penyimpangan. YMMV. - person David H; 21.10.2012

Dalam kode Anda, Anda menambahkan tampilan rootViewController ke jendela lalu segera mencoba menambahkan tampilan rootViewController ke UINavigationController yang baru. Sebagai gantinya coba ini:

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

    ...    

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

    ...
}

atau bahkan lebih baik:

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

    ...    

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

    ...
}

... ada untuk menunjukkan bahwa ini adalah contoh -application:didFinishLaunchingWithOptions: yang tidak lengkap. Anda perlu memastikan bahwa Anda telah menyertakan pembuatan UIWindow dan memanggil -makeKeyAndVisible di dalamnya.

person Adam Swinden    schedule 27.09.2012