ตั้งค่ามุมมองเริ่มต้นใน appdelegate - swift


147

ฉันต้องการตั้งค่า viewcontroller เริ่มต้นจาก appdelegate ฉันพบคำตอบที่ดีจริงๆ แต่มันอยู่ใน Objective C และฉันมีปัญหาในการบรรลุสิ่งเดียวกันอย่างรวดเร็ว

ตั้งค่าตัวควบคุมมุมมองเริ่มต้นโดยทางโปรแกรมโดยใช้กระดานเรื่องราว

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

ใครช่วยได้บ้าง

ฉันต้องการให้ Viewcontroller เริ่มต้นขึ้นอยู่กับเงื่อนไขบางประการที่ต้องทำโดยใช้คำสั่งแบบมีเงื่อนไข


นี่เป็นสำเนาที่เป็นไปได้ของ: stackoverflow.com/questions/10428629/…
ฮันนี่

คำตอบ:


279

ฉันใช้เธรดนี้เพื่อช่วยในการแปลง C วัตถุประสงค์ให้รวดเร็วและทำงานได้อย่างสมบูรณ์

สร้างอินสแตนซ์และนำเสนอ viewController ใน Swift

รหัส Swift 2 :

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 :

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
Async-

5
นี่เป็นวิธีมาตรฐานปัจจุบันในการตั้งค่ามุมมองเริ่มต้นในแอพที่ลงทะเบียนหรือไม่? ฉันถามเพราะมันดูเหมือนแฮ็คนิดหน่อย (ขออภัย @Abs)
rigdonmr

10
@rigdonmr หากแอปพลิเคชันมีชุดสตอรีบอร์ดเป็นอินเทอร์เฟซหลักหน้าต่างจะถูกโหลดโดยอัตโนมัติและชุดควบคุมมุมมองรูทของมันถูกตั้งค่าเป็นตัวควบคุมมุมมองเริ่มต้นของกระดานเรื่องราว ถ้าตัวควบคุมมุมมองจำเป็นต้องเปลี่ยนตามเงื่อนไขหรือแอปพลิเคชันไม่มีอินเทอร์เฟซหลักเป็นที่ยอมรับเพื่อเริ่มต้นUIWindowและตั้งค่าตัวควบคุมมุมมองรากของมันโดยทางโปรแกรม
JAL

2
สิ่งที่น่าแปลกใจ (แต่ดี) ที่นี่คือการทำให้อินสแตนซ์ของตัวควบคุมมุมมองด้วยตนเองในลักษณะนี้ดูเหมือนว่าจะหยุด iOS ไม่ให้อินสแตนซ์ของคอนโทรลเลอร์มุมมองเริ่มต้นเป็นอินสแตนซ์ ฉันคาดว่าจะโหลดได้ทั้งคู่ พฤติกรรมนี้มีการบันทึกไว้ที่อื่นหรือไม่?
Pat Niemeyer

2
@MayankJain นี้ทำงานได้ดีกับสวิฟท์ 3 เพียงแค่ต้องแปลบางส่วนของรหัสจากรวดเร็วก่อนหน้านี้
JAB

42

ลองสิ่งนี้ ตัวอย่างเช่น: คุณควรใช้UINavigationControllerเป็นตัวควบคุมมุมมองเริ่มต้น จากนั้นคุณสามารถตั้งค่าตัวควบคุมมุมมองใด ๆ เป็นรูทจากกระดานเรื่องราว

 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
}

ดูหน้าจอสตอรี่บอร์ดของฉัน


คุณได้ตั้งค่า Storyboard ID สำหรับคุณดูคอนโทรลเลอร์ในกระดานเรื่องราวแล้วหรือยัง ดูjoxi.ru/l2ZYxZqS8JOomJ
protikhonoff

อ๋อตั้งไว้แล้วฉันคิดว่ามันประสบความสำเร็จในการเปิดตัวควบคุม viewview แต่มันไม่ 'แสดง' ความคิดใด ๆ
Abubakar Moallim

ไม่มีข้อผิดพลาดหลังจากเปิดหน้าจอฉันได้รับหน้าดำ
Abubakar Moallim

ฉันคิดว่าฉันพบปัญหา คุณควรตรวจสอบ "Is Initial View Controller" ในกระดานเรื่องราวของคุณ joxi.ru/8AnNbQlhq3QOAO
protikhonoff

แต่ฉันต้องการเปลี่ยน viewcontroller เริ่มต้นโดยใช้คำสั่งแบบมีเงื่อนไข
Abubakar Moallim

24

สำหรับ Swift 3, Swift 4:

ยกตัวอย่างตัวควบคุมรูทมุมมองจากกระดานเรื่องราว:

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
    }

หากคุณต้องการใช้UINavigationControllerเป็นรูท:

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:

มันเกือบจะเหมือนกัน แต่แทนที่จะเป็นเส้น

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

คุณจะต้องเขียน

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

22

หากคุณไม่ได้ใช้กระดานเรื่องราวคุณสามารถลองสิ่งนี้

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
ชื่อปลายปากกาหมายถึงอะไร?
Abubakar Moallim

@Abs nibName เป็นชื่อของปลายปากกาที่จะโหลดเพื่อดูตัวอย่าง
rashii

ภาพเคลื่อนไหวการเปลี่ยนทิศทางหยุดทำงานกับสิ่งนี้
user3427013

ฉัน upvoted lol นี้แล้ว ... "gotta init หน้าต่างแล้วตั้งค่าเป็น frame, gotta init หน้าต่างแล้วตั้งค่าเป็น frame, ต้อง init หน้าต่างแล้วตั้งกรอบเป็น" - กับตัวเอง
Chris Allinson

18

สำหรับ Xcode 11.xxx และ Swift 5.xx ใหม่ซึ่งเป้าหมายนั้นตั้งค่าเป็น iOS 13+

สำหรับโครงสร้างโครงการใหม่ AppDelegate ไม่ต้องทำอะไรเกี่ยวกับ rootViewController

คลาสใหม่มีไว้เพื่อจัดการหน้าต่างคลาส (UIWindowScene) -> ไฟล์ 'SceneDelegate'

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
ชื่นชมมาก
Azim Talukdar

14

นี่เป็นวิธีที่ดีในการเข้าถึง ตัวอย่างนี้วางตัวควบคุมการนำทางเป็นตัวควบคุมรูทมุมมองและวางตัวควบคุมมุมมองที่คุณเลือกไว้ที่ด้านล่างของการนำทางสแต็กพร้อมให้คุณกดสิ่งที่คุณต้องการ

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

ในการทำให้ตัวอย่างนี้ใช้งานได้คุณจะต้องตั้งค่า "MainViewController" เป็น Storyboard ID บนคอนโทรลเลอร์มุมมองหลักของคุณและชื่อไฟล์ของสตอรี่บอร์ดในกรณีนี้จะเป็น "MainStoryboard.storyboard" ฉันเปลี่ยนชื่อกระดานเรื่องราวของฉันด้วยวิธีนี้เพราะ Main.storyboard สำหรับฉันไม่ใช่ชื่อที่เหมาะสมโดยเฉพาะถ้าคุณเคยไปที่คลาสย่อย


11

ฉันได้ทำมันโดยมีวัตถุประสงค์ -c หวังว่ามันจะเป็นประโยชน์สำหรับคุณ

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];

คุณออกแบบตัวควบคุมดูในกระดานเรื่องราวได้อย่างไรโปรดช่วยด้วย
Poonam

ลากตัวควบคุมมุมมองและตั้งค่า ID สตอรี่บอร์ดของ ID: <ViewControllerName> และเข้าถึงตัวควบคุมมุมมองของคุณ ...
Patel Jigar

@PatelJigar วิธีตั้งค่าใน loginvc
Uma Madhavi

ตัวควบคุมมุมมองการโทรเช่น UITabBarController * tbc = [self.storyboard instantiateViewControllerWithIdentifier: @ "ContentViewController"]; [ตนเอง presentViewController: tbc เคลื่อนไหว: เสร็จสิ้นใช่: ไม่มี];
Patel Jigar

7

รหัสสำหรับ Swift 4.2 และ 5 code:

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

และสำหรับ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 ให้ข้อผิดพลาดค่าประเภท 'AppDelegate' ไม่มีสมาชิก 'หน้าต่าง' ความคิดใด ๆ
Joseph Astrahan

@JosephAstrahan ประกาศตัวแปรก่อนที่จะเรียกมัน กดvar window: UIWindow?ไลค์-
Jamil Hasnine Tamim

@JosephAstrahan ตรวจสอบคำตอบของฉันอีกครั้ง ฉันเพิ่มตัวแปร
Jamil Hasnine Tamim

ขอบคุณที่ช่วยตัน!
Joseph Astrahan

And for Xcode 11+ and for Swift 5+ส่วนหนึ่งช่วยฉันได้มาก คนขอบคุณ
Torongo

6

ฉันได้ทำใน Xcode 8 และ 3.0 swift หวังว่ามันจะเป็นประโยชน์สำหรับคุณและมันทำงานได้อย่างสมบูรณ์ ใช้รหัสต่อไปนี้:

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
}

และถ้าคุณใช้ตัวควบคุมทิศทางให้ใช้รหัสต่อไปนี้:

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
}

สวัสดี ... Mayank ฉันได้ทำใน Xcode 8 และ swift 3.0 ข้อผิดพลาดใดที่เกิดขึ้นหลังจากใช้วิธีแก้ปัญหานี้เพราะมันใช้งานได้
Kunal

6

สวิฟท์ 4:

เพิ่มบรรทัดเหล่านี้ใน AppDelegate.swift ภายในฟังก์ชัน didFinishLaunchingWithOptions () ...

    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
}

ตัวอย่างเช่นตอนนี้หลาย ๆ ครั้งที่เราทำสิ่งนี้เมื่อเราต้องการผลักดันผู้ใช้ไปยังหน้าจอเข้าสู่ระบบหรือไปยังหน้าจอตั้งค่าเริ่มต้นหรือกลับไปที่หน้าจอหลักของแอป ฯลฯ หากคุณต้องการทำเช่นนั้น คุณสามารถใช้จุดนี้เป็นทางแยกสำหรับถนนได้

ลองคิดดู คุณสามารถมีค่าเก็บไว้ใน NSUserDefaults สำหรับอินสแตนซ์ที่จัดเก็บ userLoggedIn Boolean และif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }


มันไม่ทำงานในโครงการใหม่ที่เพิ่ม 1 ViewController เริ่มต้นจากตัวควบคุมมุมมองเริ่มต้นเสมอ Xcode 11.2 จะมีปัญหาที่ไหน?
H H

5

คำตอบทั้งหมดข้างบน / ด้านล่างมีคำเตือนว่าไม่มีจุดเข้าในกระดานเรื่องราว

หากคุณต้องการให้มีตัวควบคุมมุมมองรายการ 2 (หรือมากกว่า) ที่ขึ้นอยู่กับเงื่อนไขบางอย่าง (พูดconditionVariable ) ดังนั้นสิ่งที่คุณควรทำคือ:

  • ใน Main.storyboard ของคุณสร้าง UINavigationController โดยไม่มี rootViewController ตั้งเป็นจุดเริ่มต้น
  • สร้าง 2 (หรือมากกว่า) "แสดง" ส่วนแบ่งลงในตัวควบคุมมุมมองกำหนดรหัสบางตัวให้พวกเขาพูดid1และid2
  • ใช้รหัสถัดไป:

    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
       }

หวังว่านี่จะช่วยได้


1
ข้อผิดพลาด "ไม่มีจุดเข้าในกระดานเรื่องราว" เกิดจากการกำหนดค่าโครงการที่สามารถลบได้ ไปที่โปรเจ็กต์> ข้อมูล> คุณสมบัติเป้าหมาย iOS แบบกำหนดเองและลบคุณสมบัติ "ชื่อไฟล์ฐานเรื่องราวหลัก" คำเตือนไม่ควรปรากฏอีกต่อไป
orangemako

5

หากคุณไม่ได้ใช้กระดานเรื่องราว คุณสามารถเริ่มต้นตัวควบคุมมุมมองหลักของคุณโดยทางโปรแกรม

สวิฟต์ 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
    }
}

และยังเอาMainจากข้อมูลการปรับใช้

ป้อนคำอธิบายรูปภาพที่นี่


สิ่งนี้ใช้ได้กับฉันใน Swift 4.2, XCode 11.3, IOS 9 ~ 13.3.1
Coder ACJHP

4

นี่คือโซลูชันที่สมบูรณ์แบบใน Swift 4 ใช้สิ่งนี้ใน didFinishLaunchingWithOptions

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

    }
}

เขียนฟังก์ชั่นนี้ได้ทุกที่ใน Appdelegate.swift

  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

ในกรณีที่คุณต้องการทำในตัวควบคุมมุมมองและไม่ได้อยู่ในตัวแทนแอพ:เพียงดึงข้อมูลอ้างอิงไปยัง AppDelegate ในตัวควบคุมมุมมองของคุณและรีเซ็ตเป็นวัตถุหน้าต่างด้วยตัวควบคุมมุมมองด้านขวาเนื่องจากเป็น rootviewController

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

สำหรับสวิฟท์ 4.0

ในไฟล์AppDelegate.swiftของคุณในวิธีdidfinishedlaunchingWithOptionsให้ใส่รหัสต่อไปนี้

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
}

หวังว่ามันจะทำงานได้ดี


3
ทำงาน .. ถ้าคุณไม่ได้ตั้งค่า viewController เริ่มต้นใน stroyboard คุณต้องเพิ่ม window = UIWindow (เฟรม: UIScreen.main.bounds)
Punit

3

Swift 5 & Xcode 11

ดังนั้นใน xCode 11 โซลูชันหน้าต่างจะไม่สามารถใช้งานได้ภายใน appDelegate พวกเขาย้ายสิ่งนี้ไปที่ SceneDelgate คุณสามารถหาสิ่งนี้ได้ในไฟล์ SceneDelgate.swift

คุณจะสังเกตได้ว่าตอนนี้มีvar window: UIWindow?ของขวัญ

ในสถานการณ์ของฉันฉันใช้ TabBarController จากกระดานเรื่องราวและต้องการตั้งเป็น rootViewController

นี่คือรหัสของฉัน:

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

ตรวจสอบให้แน่ใจว่าได้เพิ่มสิ่งนี้ลงในวิธีฉากที่ถูกต้องเหมือนที่ฉันทำที่นี่ โปรดทราบว่าคุณจะต้องตั้งชื่อตัวระบุสำหรับ tabBarController หรือ viewController ที่คุณใช้ในกระดานเรื่องราว

วิธีตั้งค่าสตอรี่บอร์ด ID

ในกรณีของฉันฉันกำลังทำสิ่งนี้เพื่อตั้ง stateController เพื่อติดตามตัวแปรที่แชร์กันระหว่างมุมมองแท็บ หากคุณต้องการทำสิ่งเดียวกันนี้ให้เพิ่มรหัสต่อไปนี้ ...

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

หมายเหตุ: เพียงแค่ใช้ตัวแปรของคุณเองหรืออะไรก็ตามที่คุณพยายามติดตามแทนฉันเพิ่งแสดงรายการของฉันเป็นตัวอย่างในโครงสร้าง tdfvariables

ในแต่ละมุมมองของ TabController เพิ่มตัวแปรสมาชิกต่อไปนี้

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

จากนั้นในไฟล์เดียวกันเหล่านั้นให้เพิ่มสิ่งต่อไปนี้:

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

สิ่งนี้จะช่วยให้คุณหลีกเลี่ยงวิธีการเดี่ยวในการส่งผ่านตัวแปรระหว่างมุมมอง วิธีนี้ช่วยให้ง่ายสำหรับโมเดลการฉีดพึ่งพาซึ่งเป็นวิธีที่ดีกว่าในระยะยาวและแบบซิงเกิล


3

ปิดการใช้งาน Main.storyboard

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

เพิ่ม ID สตอรีบอร์ด

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

Swift 5 และ Xcode 11

ต่ออายุ UIWindow

class CustomWindow : UIWindow {
    //...
}

สร้างโดย Xcode 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()
    }

    //...
}

สามารถตั้งค่าตัวควบคุมรูทเป็นคอนโทรลเลอร์มุมมองเริ่มต้น window.rootViewController = UIStoryboard (ชื่อ: "หลัก", บันเดิล: ไม่มี) .instantiateInitialViewController ()
Kamran Khan

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

เปิด viewcontroller ด้วย SWRevealViewController จากตัวแทนแอป

 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+


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()
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.