Saya memiliki storyboard yang disiapkan dengan login yang berfungsi dan pengontrol tampilan utama, yang terakhir adalah pengontrol tampilan tempat pengguna dinavigasi saat login berhasil. Tujuan saya adalah untuk segera menampilkan pengontrol tampilan utama jika otentikasi (disimpan dalam rantai kunci) berhasil, dan menampilkan pengontrol tampilan masuk jika otentikasi gagal. Pada dasarnya, saya ingin melakukan ini di AppDelegate saya:
// url request & response work fine, assume success is a BOOL here
// that indicates whether login was successful or not
if (success) {
// 'push' main view controller
} else {
// 'push' login view controller
}
Saya tahu tentang metode performSegueWithIdentifier: tetapi metode ini adalah metode contoh UIViewController, jadi tidak dapat dipanggil dari dalam AppDelegate. Bagaimana cara melakukan ini menggunakan papan cerita saya yang sudah ada ??
EDIT:
Pengontrol tampilan awal Storyboard sekarang adalah pengontrol navigasi yang tidak terhubung ke apa pun. Saya menggunakan perbedaan setRootViewController: karena MainIdentifier adalah UITabBarController. Maka seperti inilah garis saya terlihat:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
BOOL isLoggedIn = ...; // got from server response
NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier";
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:segueId];
if (isLoggedIn) {
[self.window setRootViewController:initViewController];
} else {
[(UINavigationController *)self.window.rootViewController pushViewController:initViewController animated:NO];
}
return YES;
}
Saran / perbaikan dipersilahkan!
sumber
[[self window] makeKeyAndVisible]
dalam application: didFinishLaunchingWithOptions: sebelum Anda mencoba dan melakukan segue bersyarat. UIApplicationMain () seharusnya pesan makeKeyAndVisible tetapi melakukannya hanya setelah didFinish ... Options: finishes. Cari "Upaya Koordinasi Antara Pengontrol Tampilan" di dokumen Apple untuk detailnya.Saya terkejut dengan beberapa solusi yang disarankan di sini.
Benar-benar tidak perlu pengontrol navigasi tiruan di papan cerita Anda, menyembunyikan tampilan & menembakkan segmen di viewDidAppear: atau peretasan lainnya.
Jika storyboard belum dikonfigurasi di file plist, Anda harus membuat sendiri jendela dan pengontrol tampilan root :
Jika storyboard yang dikonfigurasi dalam plist aplikasi, jendela dan akar controller tampilan sudah akan setup oleh aplikasi waktu: didFinishLaunching: disebut, dan makeKeyAndVisible akan dipanggil pada jendela untuk Anda.
Dalam hal ini, lebih sederhana lagi:
sumber
JIKA titik masuk papan cerita Anda bukanlah
UINavigationController
:JIKA titik masuk storyboard Anda ADALAH
UINavigationController
pengganti:dengan:
sumber
appHasLaunchedOnce ? secondViewControllerIdentifier : firstViewControllerIdentifier;
Dalam
application:didFinishLaunchingWithOptions
metode AppDelegate Anda , sebelumreturn YES
baris, tambahkan:Ganti
YourStartingViewController
dengan nama kelas pengontrol tampilan pertama Anda yang sebenarnya (yang Anda tidak ingin selalu muncul) danYourSegueIdentifier
dengan nama sebenarnya dari segue antara pengontrol awal itu dan pengontrol yang ingin Anda mulai (yang setelah segue ).Bungkus kode itu dalam
if
kondisi jika Anda tidak selalu menginginkannya terjadi.sumber
Mengingat bahwa Anda sudah menggunakan Storyboard, Anda dapat menggunakan ini untuk menyajikan pengguna dengan MyViewController, pengontrol khusus ( Mempelajari jawaban followben sedikit).
Di AppDelegate.m :
String yang diteruskan ke instantiateViewControllerWithIdentifier mengacu pada ID Storyboard, yang bisa disetel di pembuat antarmuka:
Bungkus saja ini dalam logika sesuai kebutuhan.
Jika Anda memulai dengan UINavigationController, pendekatan ini tidak akan memberi Anda kontrol navigasi.
Untuk 'melompat maju' dari titik awal pengontrol navigasi yang disiapkan melalui pembuat antarmuka, gunakan pendekatan ini:
sumber
Mengapa tidak ada layar login yang muncul pertama kali, periksa apakah pengguna sudah login dan langsung tekan layar berikutnya? Semua di ViewDidLoad.
sumber
Implementasi cepat yang sama:
Jika Anda gunakan
UINavigationController
sebagai titik masuk di storyboardsumber
Ini adalah solusi yang berhasil di iOS7. Untuk mempercepat pemuatan awal dan tidak melakukan pemuatan yang tidak perlu, saya memiliki UIViewcontroller yang benar-benar kosong yang disebut "DUMMY" di file Storyboard saya. Kemudian saya dapat menggunakan kode berikut:
sumber
Saya menyarankan untuk membuat MainViewController baru yaitu Root View Controller dari Navigation Controller. Untuk melakukan itu, cukup tahan kontrol, lalu seret koneksi antara Pengontrol Navigasi dan MainViewController, pilih 'Hubungan - Root View Controller' dari prompt.
Di MainViewController:
Ingatlah untuk membuat segues antara MainViewController dengan pengontrol tampilan Beranda dan Login. Semoga ini membantu. :)
sumber
Setelah mencoba banyak metode berbeda, saya dapat menyelesaikan masalah ini dengan ini:
sumber