Bagaimana cara saya mengatur InitialViewController
untuk Storyboard? Saya ingin membuka storyboard saya ke tampilan yang berbeda tergantung pada beberapa kondisi yang mungkin berbeda dari peluncuran ke peluncuran.
Bagaimana cara saya mengatur InitialViewController
untuk Storyboard? Saya ingin membuka storyboard saya ke tampilan yang berbeda tergantung pada beberapa kondisi yang mungkin berbeda dari peluncuran ke peluncuran.
Jawaban:
Cara tanpa kontroler tampilan awal dummy
Pastikan semua pengendali tampilan awal memiliki ID Storyboard.
Di storyboard, hapus centang atribut "Apakah pengendali tampilan awal" dari pengendali tampilan pertama.
Jika Anda menjalankan aplikasi pada titik ini, Anda akan membaca:
Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?
Dan Anda akan melihat bahwa properti jendela Anda di delegasi aplikasi sekarang nihil.
Dalam pengaturan aplikasi, buka target dan Info
tab Anda. Jelas ada nilai Main storyboard file base name
. Pada General
tab, kosongkan nilainya untukMain Interface
. Ini akan menghapus peringatan.
Buat jendela dan pengontrol tampilan awal yang diinginkan dalam metode delegasi aplikasi application:didFinishLaunchingWithOptions:
:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
return YES;
}
didFinishLaunchingWithOptions
dipanggil saat aplikasi dimulai dalam proses baru. Jika Anda membuka layar beranda dan kembali ke aplikasi, metode ini tidak akan dipanggil lagi. (Kecuali iOS berakhir karena keterbatasan memori.) Coba hentikan aplikasi dan luncurkan sekali lagi dari IDE Anda. Jika masalah berlanjut, kirim masalah ke SO dan saya akan dengan senang hati membantu, teman.
self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
Untuk semua pecinta Swift di luar sana, inilah jawabannya oleh @Travis yang diterjemahkan ke dalam SWIFT :
Lakukan apa yang @Travis jelaskan sebelum kode Objective C. Kemudian,
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var exampleViewController: ExampleViewController = mainStoryboard.instantiateViewControllerWithIdentifier("ExampleController") as! ExampleViewController
self.window?.rootViewController = exampleViewController
self.window?.makeKeyAndVisible()
return true
}
Itu ExampleViewController
akan menjadi pengontrol tampilan awal baru yang ingin Anda tampilkan.
Langkah-langkahnya menjelaskan:
Selamat menikmati dan pemrograman!
Anda dapat secara program mengatur rootViewController jendela kunci (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
sebagai contoh:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (shouldShowAnotherViewControllerAsRoot) {
UIStoryboard *storyboard = self.window.rootViewController.storyboard;
UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"rootNavigationController"];
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
}
return YES;
}
init()
/ deinit()
, tetapi tanpa mengeksekusi viewDidLoad()
atau menginisialisasi IBOutlet
-s dengan benar . Pastikan kode Anda siap untuk itu.
Swift 3: Perbarui ke kode @ victor-sigler
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
// Assuming your storyboard is named "Main"
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// Add code here (e.g. if/else) to determine which view controller class (chooseViewControllerA or chooseViewControllerB) and storyboard ID (chooseStoryboardA or chooseStoryboardB) to send the user to
if(condition){
let initialViewController: chooseViewControllerA = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardA") as! chooseViewControllerA
self.window?.rootViewController = initialViewController
)
}else{
let initialViewController: chooseViewControllerB = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardB") as! chooseViewControllerB
self.window?.rootViewController = initialViewController
)
self.window?.makeKeyAndVisible(
return true
}
Anda dapat mengatur Navigasi rootviewcontroller sebagai pengendali tampilan utama. Gagasan ini dapat digunakan untuk masuk otomatis sesuai kebutuhan aplikasi.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UIViewController viewController = (HomeController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"HomeController"];
UINavigationController navController = [[UINavigationController alloc] initWithRootViewController:viewController];
self.window.rootViewController = navController;
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
// do stuff for iOS 7 and newer
navController.navigationBar.barTintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];
navController.navigationItem.leftBarButtonItem.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];
navController.navigationBar.tintColor = [UIColor whiteColor];
navController.navigationItem.titleView.tintColor = [UIColor whiteColor];
NSDictionary *titleAttributes =@{
NSFontAttributeName :[UIFont fontWithName:@"Helvetica-Bold" size:14.0],
NSForegroundColorAttributeName : [UIColor whiteColor]
};
navController.navigationBar.titleTextAttributes = titleAttributes;
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
else {
// do stuff for older versions than iOS 7
navController.navigationBar.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];
navController.navigationItem.titleView.tintColor = [UIColor whiteColor];
}
[self.window makeKeyAndVisible];
Untuk Pengguna StoryboardSegue
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
// Go to Login Screen of story board with Identifier name : LoginViewController_Identifier
LoginViewController *loginViewController = (LoginViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@“LoginViewController_Identifier”];
navigationController = [[UINavigationController alloc] initWithRootViewController:testViewController];
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
// Go To Main screen if you are already Logged In Just check your saving credential here
if([SavedpreferenceForLogin] > 0){
[loginViewController performSegueWithIdentifier:@"mainview_action" sender:nil];
}
Terima kasih
Buka mainstoryboard, pilih tampilan yang ingin Anda mulai terlebih dahulu, lalu buka Utilities -> Attributes. Di bawah "View Controller" Anda melihat tombol radio "Is initial View Controller". Pilih saja.
--- Untuk pertanyaan yang direvisi:
Mungkin Anda dapat mencoba ini: menulis metode di bagian ViewDidLoad tampilan awal Anda dan ketika metode berjalan pada saat peluncuran aplikasi, metode memicu segue ke tampilan lain.
SWIFT 5
Jika Anda tidak memiliki set ViewController sebagai ViewController awal di storyboard, Anda perlu melakukan 2 hal:
Akhirnya, Anda sekarang dapat menambahkan kode Anda di SceneDelegate:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// Make sure you set an Storyboard ID for the view controller you want to instantiate
window?.rootViewController = storyboard.instantiateViewController(withIdentifier: identifier)
window?.makeKeyAndVisible()
}
Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set
peringatan yang saya miliki setelah saya memutuskan untuk instantiate VC awal saya dalam kode. Poin penting, ketika @ rs7 mengatakan "hapus bidang nama storyboard", artinya seluruh baris plist, bukan hanya konten bidang itu sendiri.
Anda dapat mengatur initial view controller
menggunakan Interface Builder dan juga secara terprogram.
Di bawah ini adalah pendekatan yang digunakan untuk pemrograman.
Tujuan-C:
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; // <storyboard id>
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
return YES;
Cepat:
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var objMainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainController") as! MainViewController
self.window?.rootViewController = objMainViewController
self.window?.makeKeyAndVisible()
return true
Saya membuat kelas perutean untuk menangani navigasi dinamis dan menjaga kelas AppDelegate tetap bersih, saya harap ini akan membantu lainnya juga.
//
// Routing.swift
//
//
// Created by Varun Naharia on 02/02/17.
// Copyright © 2017 TechNaharia. All rights reserved.
//
import Foundation
import UIKit
import CoreLocation
class Routing {
class func decideInitialViewController(window:UIWindow){
let userDefaults = UserDefaults.standard
if((Routing.getUserDefault("isFirstRun")) == nil)
{
Routing.setAnimatedAsInitialViewContoller(window: window)
}
else if((userDefaults.object(forKey: "User")) != nil)
{
Routing.setHomeAsInitialViewContoller(window: window)
}
else
{
Routing.setLoginAsInitialViewContoller(window: window)
}
}
class func setAnimatedAsInitialViewContoller(window:UIWindow) {
Routing.setUserDefault("Yes", KeyToSave: "isFirstRun")
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let animatedViewController: AnimatedViewController = mainStoryboard.instantiateViewController(withIdentifier: "AnimatedViewController") as! AnimatedViewController
window.rootViewController = animatedViewController
window.makeKeyAndVisible()
}
class func setHomeAsInitialViewContoller(window:UIWindow) {
let userDefaults = UserDefaults.standard
let decoded = userDefaults.object(forKey: "User") as! Data
User.currentUser = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! User
if(User.currentUser.userId != nil && User.currentUser.userId != "")
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let homeViewController: HomeViewController = mainStoryboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
let loginViewController: UINavigationController = mainStoryboard.instantiateViewController(withIdentifier: "LoginNavigationViewController") as! UINavigationController
loginViewController.viewControllers.append(homeViewController)
window.rootViewController = loginViewController
}
window.makeKeyAndVisible()
}
class func setLoginAsInitialViewContoller(window:UIWindow) {
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let loginViewController: UINavigationController = mainStoryboard.instantiateViewController(withIdentifier: "LoginNavigationViewController") as! UINavigationController
window.rootViewController = loginViewController
window.makeKeyAndVisible()
}
class func setUserDefault(_ ObjectToSave : Any? , KeyToSave : String)
{
let defaults = UserDefaults.standard
if (ObjectToSave != nil)
{
defaults.set(ObjectToSave, forKey: KeyToSave)
}
UserDefaults.standard.synchronize()
}
class func getUserDefault(_ KeyToReturnValye : String) -> Any?
{
let defaults = UserDefaults.standard
if let name = defaults.value(forKey: KeyToReturnValye)
{
return name as Any
}
return nil
}
class func removetUserDefault(_ KeyToRemove : String)
{
let defaults = UserDefaults.standard
defaults.removeObject(forKey: KeyToRemove)
UserDefaults.standard.synchronize()
}
}
Dan di AppDelegate Anda panggil ini
self.window = UIWindow(frame: UIScreen.main.bounds)
Routing.decideInitialViewController(window: self.window!)
Solusi lain dengan menggunakan Swift 3 dan Swift 4 dengan menghindari casting gaya adalah seperti ini
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
guard let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController") as? YourViewController else {
return false
}
self.window?.rootViewController = viewController
self.window?.makeKeyAndVisible()
return true
}
Dan di bawah ini digunakan dengan UINavigationController
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
guard let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController") as? YourViewController else {
return false
}
let navigationController = UINavigationController(rootViewController: viewController)
self.window?.rootViewController = navigationController
self.window?.makeKeyAndVisible()
return true
}
Dalam AppDelegate.swift
Anda dapat menambahkan kode berikut:
let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "YourViewController_StorboardID")
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
Tentu saja, Anda perlu mengimplementasikan logika Anda, berdasarkan pada kriteria mana Anda akan memilih pengontrol tampilan yang sesuai.
Juga, jangan lupa untuk menambahkan identitas (pilih storyboard -> Scene Controller -> Tampilkan inspektur identitas -> assign StorboardID).
JAWABAN TERBARU untuk iOS 13 dan delegasi adegan:
pastikan dalam file info.plist Anda, Anda masuk ke Application Scene Manifest -> Scene Configuration -> Aplikasi Session Role -> Item 0 dan hapus referensi ke storyboard utama di sana juga. Kalau tidak, Anda akan mendapatkan peringatan yang sama tentang kegagalan instantiate dari storyboard.
Juga, pindahkan kode dari delegasi aplikasi ke adegan metode delegasi adegan (_: willConnectTo: options :), karena di sinilah peristiwa siklus hidup ditangani sekarang.
Beberapa hari yang lalu saya mengalami situasi yang sama. Trik yang sangat sederhana menyelesaikan masalah ini. Saya mengatur tersembunyi pengontrol tampilan awal saya sebelum launch2. Jika pengontrol tampilan awal adalah pengontrol yang tepat, pengaturannya akan terlihat di viewDidLoad. Lain, segue dilakukan untuk pengontrol tampilan yang diinginkan. Ini berfungsi sempurna di iOS 6.1 dan di atasnya. Saya yakin ini berfungsi pada versi iOS sebelumnya.
Terima kasih memodifikasi ini sebagai berikut di AppDelegate:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//Some code to check value of pins
if pins! == "Verified"{
print(pins)
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "HomePage", bundle: nil)
let exampleViewController: UINavigationController = mainStoryboard.instantiateViewControllerWithIdentifier("SBHP") as! UINavigationController
self.window?.rootViewController = exampleViewController
self.window?.makeKeyAndVisible()
}else{
print(pins)
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let exampleViewController: UINavigationController = mainStoryboard.instantiateViewControllerWithIdentifier("SBUser") as! UINavigationController
self.window?.rootViewController = exampleViewController
self.window?.makeKeyAndVisible()
}
Ditemukan solusi sederhana - tidak perlu menghapus "pemeriksaan pengontrol tampilan awal" dari storyboard dan mengedit info proyek tab dan gunakan makeKeyAndVisible
, cukup tempatkan
self.window.rootViewController = rootVC;
di
- (BOOL) application:didFinishLaunchingWithOptions:
rootVC
dari instantiateViewControllerWithIdentifier
, benar?
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewController(withIdentifier: "storyBoardid") as! ViewController
let navigationController = UINavigationController(rootViewController: vc)
UIApplication.shared.delegate.window?.rootViewController = navigationController
Cara lain adalah menyajikan viewController,
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewController(withIdentifier: "storyBoardid") as! ViewController
self.present(vc,animated:true,completion:nil)
Pertama, Anda perlu membuat objek storyboard Anda kemudian mengubah root (jika diperlukan) maka Anda mengambil referensi pengontrol tampilan tertentu yang mendorong pengontrol tampilan saat ini (jika Anda mengubah root) lain itu hanya hadir pengontrol tampilan baru yang mungkin Anda
Swift 4, Xcode 9
dalam file AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let firstVC = storyboard.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController
self.window?.rootViewController = firstVC
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if (PreferenceHelper.getAccessToken() != "") {
let initialViewController = storyboard.instantiateViewController(withIdentifier: "your View Controller Identifier")
self.window?.rootViewController = initialViewController
} else {
let initialViewController = storyboard.instantiateViewController(withIdentifier: "your View Controller identifier")
self.window?.rootViewController = initialViewController
}
self.window?.makeKeyAndVisible()
return true
}
/*
use your view Controller identifier must use it doubles quotes**strong text**
Swift 5 atau di atas # buat pengendali tampilan rute dengan kode sederhana ini. Jika Anda menggunakan xcode 11 atau lebih, inisialisasi pertama var window: UIWindow?
di AppDelegate
let rootVC = mainStoryboard.instantiateViewController(withIdentifier: "YOURCONTROLLER") as! YOURCONTROLLER
navigationController.setNavigationBarHidden(true, animated: true)
UIApplication.shared.windows.first?.rootViewController = UINavigationController.init(rootViewController: rootVC)
UIApplication.shared.windows.first?.makeKeyAndVisible()
Jika Anda memilih untuk tidak mengubah applicationDidFinish, Anda dapat melakukan trik berikut:
Atur pengontrol Navigasi sebagai pengontrol tampilan awal dan tetapkan untuk itu kelas khusus 'MyNavigationController'. Kemudian Anda dapat mengubah pengontrol tampilan root selama viewDidLoad - itu akan menimpa pengontrol tampilan root yang Anda atur di storyboard Anda.
class MyNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
if !isLoggedIn() {
viewControllers = [R.storyboard.authentication.loginView()!]
}
}
private func isLoggedIn() -> Bool {
return false
}
}