InitialViewController
Bir Storyboard için programlı olarak nasıl ayarlayabilirim ? Film şeridi, lansmandan lansmana kadar değişebilecek bazı koşullara bağlı olarak farklı bir görünüme açmak istiyorum.
InitialViewController
Bir Storyboard için programlı olarak nasıl ayarlayabilirim ? Film şeridi, lansmandan lansmana kadar değişebilecek bazı koşullara bağlı olarak farklı bir görünüme açmak istiyorum.
Yanıtlar:
Sahte ilk görünüm denetleyicisi olmadan nasıl
Tüm ilk görünüm denetleyicilerinde bir Öykü Paketi Kimliği bulunduğundan emin olun.
Film şeridinde, ilk görünüm denetleyicisinden "Başlangıçtaki Görünüm Denetleyicisi" özelliğinin işaretini kaldırın.
Uygulamanızı bu noktada çalıştırırsanız şunları okuyacaksınız:
Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?
Ve uygulama temsilcisindeki pencere mülkünüzün artık sıfır olduğunu fark edeceksiniz.
Uygulamanın ayarında, hedefinize ve Info
sekmesine gidin. Orada değeri açık Main storyboard file base name
. On General
sekmesi, değerini temizleyin Main Interface
. Bu uyarıyı kaldıracaktır.
Uygulama temsilcisinin application:didFinishLaunchingWithOptions:
yönteminde pencereyi ve istenen ilk görünüm denetleyicisini oluşturun :
- (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
, uygulama yeni bir işlemde başlatıldığında çağrılır. Ana ekrana gidip uygulamaya geri dönerseniz, bu yöntem tekrar çağrılmaz. (İOS bellek kısıtlamaları nedeniyle sona ermediği sürece.) Uygulamayı durdurmayı ve IDE'nizden bir kez daha başlatmayı deneyin. Sorun devam ederse, sorunu SO'ya gönderin ve size yardımcı olmaktan memnuniyet duyarız, arkadaşım.
self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
Hepsi için Swift orada severler, burada tarafından cevaptır @Travis çevrildi SWIFT :
@Travis'in Amaç C kodundan önce açıkladıklarını yapın . Sonra,
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
}
ExampleViewController
Eğer göstermek istiyorum yeni başlangıç görünümü denetleyicisi olacaktır.
Adımlar açıklanmıştır:
Keyfini çıkarın ve mutlu programlama!
Anahtar pencerenin rootViewController'ını programlı olarak (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Örneğin:
- (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()
döngüsünün içinden geçeceğini , ancak -s yürütülmeden viewDidLoad()
veya uygun şekilde başlatılmayacağını unutmayın IBOutlet
. Kodun buna hazır olduğundan emin olun.
Swift 3: @ victor-sigler kodunda güncelleme
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
}
Gezinme rootviewcontroller'ı ana görünüm denetleyicisi olarak ayarlayabilirsiniz. Bu fikir, uygulama gereksinimlerine göre otomatik oturum açma için kullanılabilir.
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];
StoryboardSegue Kullanıcıları için
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];
}
Teşekkürler
Ana panoyu açın, önce başlamasını istediğiniz görünümü seçin, ardından Yardımcı Programlar -> Özellikler'i açın. "Görüntü Denetleyici" nin altında "Başlangıç Görüntü Denetleyicidir" radyo düğmesini görürsünüz. Sadece seçin.
--- Gözden geçirilmiş soruya:
Bunu deneyebilirsiniz: başlangıç görünümünüzün ViewDidLoad bölümüne bir yöntem yazın ve yöntem uygulama başlatıldığında çalıştığında, yöntem bir segue'i başka bir görünüme tetikler.
SWIFT 5
Film şeridinde ilk ViewController olarak ayarlanmış bir ViewControllerınız yoksa 2 şey yapmanız gerekir:
Son olarak, kodunuzu şimdi SceneDelegate'e ekleyebilirsiniz:
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
koddaki ilk VC'mi başlatmaya karar verdikten sonra aldığım uyarıyı düzeltti . Önemli bir nokta, @ rs7 "film şeridi adı alanını sil" dediğinde, sadece alanın içeriği değil, plistin tüm satırı anlamına gelir.
initial view controller
Interface Builder'ı kullanarak ve programlı olarak ayarlayabilirsiniz .
Aşağıda programlı olarak kullanılan yaklaşım verilmiştir.
Amaç-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;
Swift:
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
Dinamik gezinmeyi idare etmek ve AppDelegate sınıfını temiz tutmak için bir yönlendirme sınıfı oluşturdum, umarım diğerlerine de yardımcı olacaktır.
//
// 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()
}
}
Ve AppDelegate'inizde buna
self.window = UIWindow(frame: UIScreen.main.bounds)
Routing.decideInitialViewController(window: self.window!)
Hızlı dökümden kaçınarak Swift 3 ve Swift 4'ü kullanmanın başka bir çözümü şöyledir
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
}
Ve aşağıda 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
}
İçinde AppDelegate.swift
aşağıdaki kodu ekleyebilirsiniz:
let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "YourViewController_StorboardID")
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
Elbette, hangi kriterlere göre uygun bir görünüm denetleyicisi seçeceğinize bağlı olarak mantığınızı uygulamanız gerekir.
Ayrıca, bir kimlik eklemeyi de unutmayın (film şeridi -> Denetleyici Sahnesi -> Kimlik denetçisini göster -> StorboardID'yi atayın).
İOS 13 ve sahne delegesi için GÜNCEL CEVAP:
info.plist dosyanızda Application Scene Manifest -> Scene Configuration -> Application Session Role -> Item 0 bölümüne girdiğinizden emin olun ve orada ana storyboard referansını da silin. Aksi takdirde, film şeridinden örneklenememe konusunda aynı uyarıyı alırsınız.
Ayrıca, uygulama delegesinden kodu sahne delege yöntemi sahnesine (_: willConnectTo: options :) taşıyın, çünkü yaşam döngüsü olaylarının işlendiği yer burasıdır.
Birkaç gün önce aynı durumla karşılaştım. Çok basit bir hile bu sorunu çözdü. İlk görünüm denetleyicimi lansmandan önce gizledim. İlk görünüm denetleyicisi doğru denetleyiciyse, viewDidLoad içinde görünür olarak ayarlanır. Aksi takdirde, istenen görüntü denetleyicisine bir segue gerçekleştirilir. İOS 6.1 ve sonraki sürümlerde mükemmel çalışır. Eminim iOS'un önceki sürümlerinde çalışır.
Teşekkürler bunu AppDelegate'de şu şekilde değiştirdi:
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()
}
Basit bir çözüm bulundu - film şeridi ve düzenleme projesi Bilgi sekmesinden "ilk görünüm denetleyicisi kontrolünü" kaldırmaya gerek yok ve kullanın makeKeyAndVisible
, sadece yerleştirin
self.window.rootViewController = rootVC;
içinde
- (BOOL) application:didFinishLaunchingWithOptions:
rootVC
gelen instantiateViewControllerWithIdentifier
doğru?
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
Başka bir yol da viewController'ı sunmaktır,
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewController(withIdentifier: "storyBoardid") as! ViewController
self.present(vc,animated:true,completion:nil)
İlk önce film şeridinizin nesnesini oluşturmanız ve ardından kök değiştirmeniz (gerekirse), o zaman geçerli görünüm denetleyicisine (kök değiştirirseniz) itilen belirli bir görünüm denetleyicisinin referansını almanız gerekir;
Swift 4, Xcode 9
AppDelegate.swift dosyasında
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 veya üstü # bu basit kodla rota görünümü denetleyicisi yapar. Xcode 11 veya daha yeni bir var window: UIWindow?
sürümü kullanıyorsanız, ilk olarak AppDelegate'te başlangıç durumuna getirin
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()
ApplicationDidFinish'i değiştirmemeyi tercih ederseniz, aşağıdaki hileyi yapabilirsiniz:
Gezinti denetleyicisini ilk görünüm denetleyicisi olarak ayarlayın ve ona özel bir sınıf 'MyNavigationController' atayın. Sonra viewDidLoad sırasında kök görünümü denetleyicisini düzenleyebilirsiniz - film şeridinde ayarladığınız kök görünümü denetleyicisini geçersiz kılar.
class MyNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
if !isLoggedIn() {
viewControllers = [R.storyboard.authentication.loginView()!]
}
}
private func isLoggedIn() -> Bool {
return false
}
}