appdelegate'te ilk görünüm denetleyicisini ayarla - hızlı


151

Appdelegate'ten ilk viewcontroller'ı ayarlamak istiyorum. Gerçekten iyi bir cevap buldum, ancak bu Hedef C'de ve aynı şeyi hızlı bir şekilde elde etmekte zorlanıyorum.

Storyboard'ları kullanarak ilk görünüm denetleyicisini programlı olarak ayarlayın

- (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;
}

Yardım edebilecek kimse var mı?

İlk Viewcontroller'ın bir koşullu ifade kullanılarak karşılanan belirli koşullara bağlı olmasını istiyorum.


Bu,
Honey

Yanıtlar:


285

Bu konuyu C hedefini hızlı hale getirmeme yardımcı olması için kullandım ve mükemmel çalışıyor.

Swift'de bir viewController'ı Örnekleme ve Sunma

Swift 2 kodu:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("LoginSignupVC")

    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()

    return true
}

Swift 3 kodu:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let initialViewController = storyboard.instantiateViewController(withIdentifier: "LoginSignupVC")

    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()

    return true
}

1
swift 2 uygulamasında storyboard "Main" veya "Storyboard.storyboard"
bulamıyor

5
Bu, appdelegate'te ilk görünüm denetleyicisini ayarlamanın geçerli standart yolu mu? Birazcık hack gibi göründüğü için soruyorum (üzgünüm @Abs).
rigdonmr

11
@rigdonmr Uygulama, Ana Arayüz olarak bir Storyboard'a sahipse, pencere otomatik olarak yüklenir ve kök görünüm denetleyicisi, film şeridinin ilk görünüm denetleyicisine ayarlanır. Görünüm denetleyicisinin bir koşula göre değişmesi gerekiyorsa veya uygulamanın bir Ana Arabirimi yoksa, a'yı başlatmak UIWindowve kök görünüm denetleyicisini programlı olarak ayarlamak kabul edilebilir .
JAL

2
Buradaki şaşırtıcı (ama iyi) şey, görünüm denetleyicisinin bu şekilde manuel olarak başlatılmasının, iOS'un varsayılan görünüm denetleyicisini örneklemesini durdurmasıdır. Her ikisinin de yüklenmesini beklemiş olabilirim. Bu davranış bir yerde belgelenmiş mi?
Pat Niemeyer

2
@MayankJain bu Swift 3 ile iyi çalışıyor, sadece daha önceki swift'ten kodun bir kısmını çevirmeniz gerekiyor
JAB

43

Bunu dene. Örneğin: UINavigationControllerİlk görünüm denetleyicisi olarak kullanmalısınız . Ardından, herhangi bir görünüm denetleyicisini film şeridinden kök olarak ayarlayabilirsiniz.

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    let storyboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let navigationController:UINavigationController = storyboard.instantiateInitialViewController() as UINavigationController
    let rootViewController:UIViewController = storyboard.instantiateViewControllerWithIdentifier("VC") as UIViewController
    navigationController.viewControllers = [rootViewController]
    self.window?.rootViewController = navigationController
    return true
}

Film şeridi ekranıma bakın .


Storyboard'da denetleyiciyi görüntülemek için Storyboard Kimliği ayarladınız mı? Bkz joxi.ru/l2ZYxZqS8JOomJ
protikhonoff

Evet zaten ayarlandı, sanırım görüntüleme kontrolörlerini başarıyla açıyor, ancak onu 'göstermiyor'. Herhangi bir fikir?
Abubakar Moallim

Hata yok, ekran başlatıldıktan sonra siyah bir sayfa
alıyorum

Sanırım sorunu buldum. Film şeridinizde "İlk Görünüm Denetleyicisidir" seçeneğini işaretlemelisiniz. joxi.ru/8AnNbQlhq3QOAO
protikhonoff

ancak bir koşullu ifade kullanarak ilk görünüm denetleyicisini değiştirmek istiyorum.
Abubakar Moallim

27

Swift 3, Swift 4 için:

Film şeridinden kök görünüm denetleyicisini örnekleyin:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // this line is important
        self.window = UIWindow(frame: UIScreen.main.bounds)

        // In project directory storyboard looks like Main.storyboard,
        // you should use only part before ".storyboard" as it's name,
        // so in this example name is "Main".
        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)

        // controller identifier sets up in storyboard utilities
        // panel (on the right), it called Storyboard ID
        let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController

        self.window?.rootViewController = viewController
        self.window?.makeKeyAndVisible()        
        return true
    }

UINavigationControllerKök olarak kullanmak istiyorsanız :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // this line is important
        self.window = UIWindow(frame: UIScreen.main.bounds)

        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController
        let navigationController = UINavigationController.init(rootViewController: viewController)
        self.window?.rootViewController = navigationController

        self.window?.makeKeyAndVisible()        
        return true
    }

Xib'den kök görünüm denetleyicisini örnekleyin:

Neredeyse aynı, ancak çizgiler yerine

let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController

yazmak zorundasın

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)

22

film şeridi kullanmıyorsanız, bunu deneyebilirsiniz

var window: UIWindow?
var initialViewController :UIViewController?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    initialViewController  = MainViewController(nibName:"MainViewController",bundle:nil)

    let frame = UIScreen.mainScreen().bounds
    window = UIWindow(frame: frame)

    window!.rootViewController = initialViewController
    window!.makeKeyAndVisible()

    return true
}

1
uç adı neyi ifade ediyor?
Abubakar Moallim

@Abs nibName, görünümü somutlaştırmak için yüklenecek ucun adıdır.
rashii

Oryantasyon geçiş animasyonları bununla çalışmayı durdurur.
user3427013

Zaten "penceresi sonra pencere sonra gerek pencere daha sonra gerek init, 's çerçevesini ayarlamak init,' s çerçevesini ayarlamak 's çerçevesini ayarlamak lazım init" kendime -Ben bu lol ... upvoted
Chris Allinson

21

Hedefin iOS 13+ olarak ayarlandığı yeni Xcode 11.xxx ve Swift 5.xx için.

Yeni proje yapısı için, AppDelegate'in rootViewController ile ilgili herhangi bir şey yapması gerekmez.

Pencere (UIWindowScene) sınıfı -> 'SceneDelegate' dosyasını işlemek için yeni bir sınıf var.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = // Your RootViewController in here
        self.window = window
        window.makeKeyAndVisible()
    }

}

1
Çok takdir edildi.
Azim Talukdar

14

İşte ona yaklaşmanın iyi bir yolu. Bu örnek, bir gezinti denetleyicisini kök görünüm denetleyicisi olarak yerleştirir ve istediğiniz görünüm denetleyicisini bunun içine, gezinme yığınının alt kısmına yerleştirir, ondan ihtiyacınız olan her şeyi itmeniz için hazırdır.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    // mainStoryboard
    let mainStoryboard = UIStoryboard(name: "MainStoryboard", bundle: nil)

    // rootViewController
    let rootViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainViewController") as? UIViewController

    // navigationController
    let navigationController = UINavigationController(rootViewController: rootViewController!)

    navigationController.navigationBarHidden = true // or not, your choice.

    // self.window
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    self.window!.rootViewController = navigationController

    self.window!.makeKeyAndVisible()
}

Bu örneğin çalışmasını sağlamak için, ana görünüm denetleyicinizde Storyboard ID olarak "MainViewController" öğesini ayarlarsınız ve bu durumda film şeridinin dosya adı "MainStoryboard.storyboard" olur. Storyboardlarımı bu şekilde yeniden adlandırıyorum çünkü Main.storyboard benim için uygun bir isim değil, özellikle de alt sınıfa geçerseniz.


11

Bunu objektif c ile yapmıştım umarım senin için yararlı olur

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

UIViewController *viewController;

NSUserDefaults *loginUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *check=[loginUserDefaults objectForKey:@"Checklog"];

if ([check isEqualToString:@"login"]) {

    viewController = [storyboard instantiateViewControllerWithIdentifier:@"SWRevealViewController"];
} else {

    viewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
}


self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];

Film şeridinde Denetleyicileri Görüntüle'yi nasıl tasarladınız.Lütfen yardım edin.
Poonam

denetleyicileri görüntüleyin ve kimliğin storyboard kimliğini ayarlayın: <ViewControllerName> ve görünüm denetleyicinize erişin ...
Patel Jigar

@PatelJigar loginvc'de nasıl ayarlanır
Uma

bu UITabBarController * tbc = [self.storyboard instantiateViewControllerWithIdentifier: @ "ContentViewController"] gibi görünüm denetleyicisini çağırın; [kendi kendine mevcutViewController: tbc animasyonlu: YES tamamlama: nil];
Patel Jigar

9

Swift 4.2 ve 5 kodu için kod:

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     self.window = UIWindow(frame: UIScreen.main.bounds)

     let storyboard = UIStoryboard(name: "Main", bundle: nil)

     let initialViewController = storyboard.instantiateViewController(withIdentifier: "dashboardVC")

     self.window?.rootViewController = initialViewController
     self.window?.makeKeyAndVisible()
}

Ve için Xcode 11+ and for Swift 5+:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

     var window: UIWindow?

     func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
         if let windowScene = scene as? UIWindowScene {
             let window = UIWindow(windowScene: windowScene)

              window.rootViewController = // Your RootViewController in here

              self.window = window
              window.makeKeyAndVisible()
         }
    }
}

self.window hata veriyor 'AppDelegate' türünün değeri üye 'penceresi' içermiyor, herhangi bir fikir?
Joseph Astrahan

@JosephAstrahan onu çağırmadan önce bir değişken bildirir. Gibi - var window: UIWindow?.
Jamil Hasnine Tamim

@JosephAstrahan cevabımı tekrar kontrol et. Değişken ekledim.
Jamil Hasnine Tamim

Teşekkürler, bu çok yardımcı oluyor!
Joseph Astrahan

And for Xcode 11+ and for Swift 5+kısmı bana çok yardımcı oluyor. teşekkürler dostum
Torongo

6

Xcode 8 ve swift 3.0'da yaptım, umarım sizin için yararlı olur ve mükemmel çalışır. Aşağıdaki kodu kullanın:

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {       
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let initialViewController = storyboard.instantiateViewController(withIdentifier: "ViewController")
    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()
    return true
}

Gezinti denetleyicisini kullanıyorsanız, bunun için aşağıdaki kodu kullanın:

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let navigationController:UINavigationController = storyboard.instantiateInitialViewController() as! UINavigationController
    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController")
    navigationController.viewControllers = [initialViewController]
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()      
    return true
}

Merhaba ... Mayank, Xcode 8 ve swift 3.0'da yaptım Bu çözümü kullandıktan sonra hangi hata geliyor çünkü çalışıyor
Kunal

6

Swift 4:

Bu satırları didFinishLaunchingWithOptions () işlevi içindeki AppDelegate.swift içine ekleyin ...

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // Setting the Appropriate initialViewController

    // Set the window to the dimensions of the device
    self.window = UIWindow(frame: UIScreen.main.bounds)

    // Grab a reference to whichever storyboard you have the ViewController within
    let storyboard = UIStoryboard(name: "Name of Storyboard", bundle: nil)

    // Grab a reference to the ViewController you want to show 1st.
    let initialViewController = storyboard.instantiateViewController(withIdentifier: "Name of ViewController")

    // Set that ViewController as the rootViewController
    self.window?.rootViewController = initialViewController

    // Sets our window up in front
    self.window?.makeKeyAndVisible()

    return true
}

Şimdi, örneğin, birçok kez kullanıcıyı bir giriş ekranına veya ilk kurulum ekranına veya uygulamanın ana ekranına vb. Götürmek istediğimizde böyle bir şey yapıyoruz. Siz de böyle bir şey yapmak istiyorsanız , bu noktayı bunun için bir yol çatalı olarak kullanabilirsiniz.

Bunu düşün. NSUserDefaults'da depolanan bir değere sahip olabilirsiniz, örneğin bir userLoggedIn Boolean veif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }


1 ViewController eklenmiş yeni bir projede çalışmaz. Her zaman ilk görünüm denetleyicisinden başlar. Xcode 11.2 Nerede sorun olabilir?
Oleh H

6

Film şeridini kullanmıyorsanız. Ana görünüm denetleyicinizi programlı olarak başlatabilirsiniz.

Swift 4

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let rootViewController = MainViewController()
    let navigationController = UINavigationController(rootViewController: rootViewController)
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

    return true
}
class MainViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .green
    }
}

Ve ayrıca kaldırmak Maingelen Dağıtım Bilgisi .

görüntü açıklamasını buraya girin


Bu benimle Swift 4.2, XCode 11.3, IOS 9 ~ 13.3.1
Coder ACJHP

5

Yukarıdaki / aşağıdaki tüm cevaplar, film şeridinde giriş noktası olmadığına dair bir uyarı üretiyor.

Bazı durumuna bağlıdır 2 (veya daha fazla) giriş görünümü denetleyicileri olmasını istiyorsanız (ki conditionVariable o zaman ne yapmanız gerektiğini gösterir):

  • Main.storyboard'unuzda rootViewController olmadan UINavigationController oluşturun, onu giriş noktası olarak ayarlayın
  • Görünüm denetleyicilerinde 2 (veya daha fazla) "Göster" segment oluşturun, bunlara id1 ve id2 gibi bir kimlik atayın
  • Sonraki kodu kullan:

    class AppDelegate: UIResponder, UIApplicationDelegate {
    
       var window: UIWindow?
    
       func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
           let navigationController = window!.rootViewController! as! UINavigationController
           navigationController.performSegueWithIdentifier(conditionVariable ? "id1" : "id2")
    
           return true
       }
    

Bu yardımcı olur umarım.


1
"film şeridinde giriş noktası yok" hatası, silinebilen bir proje yapılandırmasından kaynaklanmaktadır. proje> bilgi> özel iOS hedef özelliklerine gidin ve "Ana film şeridi dosya temel adı" özelliğini silin. Uyarı artık görünmemelidir.
orangemako

5

Devre dışı bırak Main.storyboard

General -> Deployment Info -> Main Interface -> remove `Main` 
Info.plist -> remove Key/Value for `UISceneStoryboardFile` and  `UIMainStoryboardFile`

Storyboard Kimliği ekleyin

Main.storyboard -> Select View Controller -> Inspectors -> Identity inspector -> Storyboard ID -> e.g. customVCStoryboardId

Swift 5 ve Xcode 11

Uzat UIWindow

class CustomWindow : UIWindow {
    //...
}

Xcode tarafından oluşturulan düzenleme SceneDelegate.swift

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: CustomWindow!

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let windowScene = (scene as? UIWindowScene) else { return }

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let initialViewController = storyboard.instantiateViewController(withIdentifier: "customVCStoryboardId")

        window = CustomWindow(windowScene: windowScene)
        window.rootViewController = initialViewController
        window.makeKeyAndVisible()
    }

    //...
}

Kök denetleyiciyi ilk görünüm denetleyicisine ayarlayabilir window.rootViewController = UIStoryboard (ad: "Main", bundle: nil) .instantiateInitialViewController ()
Kamran Khan

4

İşte tam Çözüm Swift 4'te bunu didFinishLaunchingWithOptions'da uygulayın

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

 let isLogin = UserDefaults.standard.bool(forKey: "Islogin")
    if isLogin{
        self.NextViewController(storybordid: "OtherViewController")


    }else{
        self.NextViewController(storybordid: "LoginViewController")

    }
}

bu İşlevi Appdelegate.swift içinde herhangi bir yere yazın

  func NextViewController(storybordid:String)
{

    let storyBoard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let exampleVC = storyBoard.instantiateViewController(withIdentifier:storybordid )
   // self.present(exampleVC, animated: true)
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = exampleVC
    self.window?.makeKeyAndVisible()
}

3

Bunu uygulama temsilcisinde değil de görünüm denetleyicisinde yapmak istemeniz durumunda: Yalnızca görünüm denetleyicinizdeki AppDelegate başvurusunu getirin ve bunun pencere nesnesini rootviewController olduğu gibi doğru görünüm denetleyicisiyle sıfırlayın.

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let yourVC = mainStoryboard.instantiateViewControllerWithIdentifier("YOUR_VC_IDENTIFIER") as! YourViewController
appDelegate.window?.rootViewController = yourVC
appDelegate.window?.makeKeyAndVisible()

3

İçin Swift 4.0 .

Senin içinde AppDelegate.swift dosya didfinishedlaunchingWithOptions yöntemle aşağıdaki kodu koydu.

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()

    let rootVC = MainViewController() // your custom viewController. You can instantiate using nib too. UIViewController(nib name, bundle)
    //let rootVC = UIViewController(nibName: "MainViewController", bundle: nil) //or MainViewController()
    let navController = UINavigationController(rootViewController: rootVC) // Integrate navigation controller programmatically if you want

    window?.rootViewController = navController

    return true
}

Umarım iyi çalışır.


3
Çalıştı .. Eğer stroyboard'da ilk viewController'ı ayarlamadıysanız, window = UIWindow (çerçeve: UIScreen.main.bounds)
Punit

3

Swift 5 ve Xcode 11

Dolayısıyla xCode 11'de pencere çözümü artık appDelegate içinde geçerli değildir. Bunu SceneDelgate'e taşıdılar. Bunu SceneDelgate.swift dosyasında bulabilirsiniz.

Şimdi bir var window: UIWindow?hediyesi olduğunu fark edeceksiniz .

Benim durumumda bir storyboard'dan bir TabBarController kullanıyordum ve onu rootViewController olarak ayarlamak istedim.

Bu benim kodum:

sceneDelegate.swift

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).

        self.window = self.window ?? UIWindow()//@JA- If this scene's self.window is nil then set a new UIWindow object to it.

        //@Grab the storyboard and ensure that the tab bar controller is reinstantiated with the details below.
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let tabBarController = storyboard.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController

        for child in tabBarController.viewControllers ?? [] {
            if let top = child as? StateControllerProtocol {
                print("State Controller Passed To:")
                print(child.title!)
                top.setState(state: stateController)
            }
        }

        self.window!.rootViewController = tabBarController //Set the rootViewController to our modified version with the StateController instances
        self.window!.makeKeyAndVisible()

        print("Finished scene setting code")
        guard let _ = (scene as? UIWindowScene) else { return }
    }

Bunu burada yaptığım gibi doğru sahne yöntemine eklediğinizden emin olun. Film şeridinde kullandığınız tabBarController veya viewController için tanımlayıcı adını ayarlamanız gerekeceğini unutmayın .

film şeridi kimliği nasıl ayarlanır

Benim durumumda, bunu sekme görünümleri arasında paylaşılan değişkenleri takip etmek için bir stateController ayarlamak için yapıyordum. Aynı şeyi yapmak isterseniz aşağıdaki kodu ekleyin ...

StateController.swift

import Foundation

struct tdfvars{
    var rbe:Double = 1.4
    var t1half:Double = 1.5
    var alphaBetaLate:Double = 3.0
    var alphaBetaAcute:Double = 10.0
    var totalDose:Double = 6000.00
    var dosePerFraction:Double = 200.0
    var numOfFractions:Double = 30
    var totalTime:Double = 168
    var ldrDose:Double = 8500.0
}

//@JA - Protocol that view controllers should have that defines that it should have a function to setState
protocol StateControllerProtocol {
  func setState(state: StateController)
}

class StateController {
    var tdfvariables:tdfvars = tdfvars()
}

Not: Sadece kendi değişkenlerinizi veya bunun yerine izlemeye çalıştığınız her şeyi kullanın, ben sadece benimkini tdfvariables yapısında bir örnek olarak listeledim.

TabController'ın her görünümünde aşağıdaki üye değişkeni ekleyin.

    class SettingsViewController: UIViewController {
    var stateController: StateController?
.... }

Sonra aynı dosyalara aşağıdakileri ekleyin:

extension SettingsViewController: StateControllerProtocol {
  func setState(state: StateController) {
    self.stateController = state
  }
}

Bunun yaptığı şey , görünümler arasında değişken geçişine yönelik tekli yaklaşımdan kaçınmanıza olanak tanır . Bu, uzun vadede singleton yaklaşımından çok daha iyi olan bağımlılık enjeksiyon modeline kolayca izin verir.


1
I worked out a solution on Xcode 6.4 in swift. 

// I saved the credentials on a click event to phone memory

    @IBAction func gotobidderpage(sender: AnyObject) {
 if (usernamestring == "bidder" && passwordstring == "day303")
        {
            rolltype = "1"

NSUserDefaults.standardUserDefaults().setObject(usernamestring, forKey: "username")
NSUserDefaults.standardUserDefaults().setObject(passwordstring, forKey: "password")
NSUserDefaults.standardUserDefaults().setObject(rolltype, forKey: "roll")


            self.performSegueWithIdentifier("seguetobidderpage", sender: self)
}


// Retained saved credentials in app delegate.swift and performed navigation after condition check


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

let usernamestring = NSUserDefaults.standardUserDefaults().stringForKey("username")
let passwordstring = NSUserDefaults.standardUserDefaults().stringForKey("password")
let rolltypestring = NSUserDefaults.standardUserDefaults().stringForKey("roll")

        if (usernamestring == "bidder" && passwordstring == "day303" && rolltypestring == "1")
        {

            // Access the storyboard and fetch an instance of the view controller
            var storyboard = UIStoryboard(name: "Main", bundle: nil)
            var viewController: BidderPage = storyboard.instantiateViewControllerWithIdentifier("bidderpageID") as! BidderPage

            // Then push that view controller onto the navigation stack
            var rootViewController = self.window!.rootViewController as! UINavigationController
            rootViewController.pushViewController(viewController, animated: true)
        }

        // Override point for customization after application launch.
        return true
    }



Hope it helps !

1
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
}

1

Uygulama temsilcisinden SWRevealViewController ile bir görünüm denetleyicisi açın.

 self.window = UIWindow(frame: UIScreen.main.bounds)
 let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil)
 let swrevealviewcontroller:SWRevealViewController = storyboard.instantiateInitialViewController() as! SWRevealViewController 
 self.window?.rootViewController = swrevealviewcontroller
 self.window?.makeKeyAndVisible()

0

Swift 5+ için


var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            let submodules = (
                home: HomeRouter.createModule(),
                search: SearchRouter.createModule(),
                exoplanets: ExoplanetsRouter.createModule()
            )
            
            let tabBarController = TabBarModuleBuilder.build(usingSubmodules: submodules)
            
            window.rootViewController = tabBarController
            self.window = window
            window.makeKeyAndVisible()
        }
    }


0

iOS 13+

In SceneDelegate :

var window: UIWindow?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options 
connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }
    window = UIWindow(windowScene: windowScene)
    let vc = UIViewController() //Instead of UIViewController() we initilise our initial viewController
    window?.rootViewController = vc
    window?.makeKeyAndVisible()
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.