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


252

ฉันจะตั้งInitialViewControllerเป็นกระดานเรื่องราวได้อย่างไร ฉันต้องการเปิดกระดานเรื่องราวของฉันให้มีมุมมองที่แตกต่างกันขึ้นอยู่กับเงื่อนไขบางอย่างซึ่งอาจแตกต่างจากการเปิดตัวสู่การเปิดตัว


1
ตรวจสอบคำตอบนี้โดยไม่มีการเตือนโดยไม่ต้องล้างกระดานเรื่องราวหลักในการตั้งค่า
Borzh

คำตอบ:


466

วิธีการไม่มีตัวควบคุมมุมมองเริ่มต้นจำลอง

ตรวจสอบให้แน่ใจว่าคอนโทรลเลอร์มุมมองเริ่มต้นทั้งหมดมี ID กระดานเรื่องราว

ในกระดานเรื่องราวให้ยกเลิกการเลือกแอตทริบิวต์ "เป็นตัวควบคุมมุมมองเริ่มต้น" จากตัวควบคุมมุมมองแรก

หากคุณรันแอพของคุณ ณ จุดนี้คุณจะอ่าน:

Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?

และคุณจะสังเกตเห็นว่าคุณสมบัติหน้าต่างของคุณในตัวแทนแอพอยู่ในขณะนี้ไม่มี

ในการตั้งค่าแอพให้ไปที่เป้าหมายและInfoแท็บของคุณ Main storyboard file base nameมีค่าของล้าง บนแท็บล้างค่าสำหรับGeneral Main Interfaceนี่จะเป็นการลบคำเตือน

สร้างหน้าต่างและตัวควบคุมมุมมองเริ่มต้นที่ต้องการใน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;
}

7
รัก! รัก! รัก! ฉันจะใช้สิ่งนี้เพื่อสลับระหว่างแผนผังตัวควบคุมมุมมองที่ต่างกันอย่างสิ้นเชิงสำหรับ IOS6 และ IOS7 ดูเหมือนว่าวิธีที่ดีที่สุดในการจัดการกับความเข้ากันได้แบบย้อนหลังในขณะที่ยังคงใช้ระฆังและนกหวีดทั้งหมดใน IOS7
Hunkpapa

6
ฉันกำลังเรียนรู้การเขียนโปรแกรม iOS ใน Swift ทุกคนสามารถช่วยฉันในการเขียนโค้ดข้างต้นได้อย่างรวดเร็ว กรุณาช่วย. ขอบคุณ
Raghavendra

1
@bdv didFinishLaunchingWithOptionsถูกเรียกเมื่อเริ่มต้นแอพในกระบวนการใหม่ หากคุณไปที่หน้าจอหลักและกลับไปที่แอพวิธีนี้จะไม่ถูกเรียกอีกครั้ง (เว้นแต่ iOS จะยุติเนื่องจากข้อ จำกัด ของหน่วยความจำ) ลองหยุดแอพและเปิดใช้งานอีกครั้งจาก IDE ของคุณ หากปัญหายังคงมีอยู่ให้โพสต์ปัญหาไปที่ SO และฉันยินดีที่จะช่วยเหลือเพื่อน
เทรวิส

2
@ peyman จากการตรวจสอบของฉันไม่มีหน้าต่างปรากฏขึ้นเมื่อมีการลบการอ้างอิงไปยังกระดานเรื่องราวหลัก ฉันแสดงความคิดเห็นการสร้างหน้าต่างในโครงการปัจจุบันของฉันและพบว่าสิ่งนี้ยังคงเป็นจริง
เทรวิส

2
@Raghav นี่คือรหัสที่รวดเร็ว:self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
mjmayank

121

สำหรับผู้ชื่นชอบSwiftทุกคนนี่คือคำตอบของ@Travis ที่แปลเป็นSWIFT :

ทำสิ่งที่@Travisอธิบายก่อนรหัสวัตถุประสงค์ C จากนั้น

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จะเป็นตัวควบคุมมุมมองใหม่เริ่มต้นที่คุณต้องการจะแสดง

ขั้นตอนอธิบาย:

  1. สร้างหน้าต่างใหม่ด้วยขนาดของหน้าต่างปัจจุบันและตั้งเป็นหน้าต่างหลักของเรา
  2. ยกตัวอย่างกระดานเรื่องราวที่เราสามารถใช้เพื่อสร้างตัวควบคุมมุมมองเริ่มต้นใหม่ของเรา
  3. ยกตัวอย่างตัวควบคุมมุมมองเริ่มต้นใหม่ของเราตาม Storyboard ID
  4. ตั้งค่าตัวควบคุมรูทของหน้าต่างใหม่เป็นตัวควบคุมใหม่ที่เราเพิ่งเริ่มต้น
  5. ทำให้หน้าต่างใหม่ของเรามองเห็นได้

สนุกและการเขียนโปรแกรมมีความสุข!


ฉันถูกถาม @Travis สำหรับรุ่นนี้แล้ว ... ขอบคุณ แต่อย่างใด
dellos

ID สตอรีบอร์ดอยู่ภายใต้ส่วนข้อมูลประจำตัวในบานหน้าต่างตัวตรวจสอบตัวตน
โดมินิค

2
เคล็ดลับที่ไม่จำเป็นต้องใช้สตอรี่บอร์ด ID คือการตั้งค่าตัวควบคุมมุมมองเริ่มต้น (rootViewController) ในสตอรี่บอร์ดอย่างชัดเจนและใช้เมธอดอินสแตนซ์ UIStoryboard.instantiateInitialViewController () เพื่อรับตัวควบคุมแทน UIStoryboard.instantiateViewControllerWithIdentifier () ที่เหลือก็เหมือนกัน
Eric Boumendil

45

คุณสามารถตั้งค่า rootViewController ของหน้าต่างคีย์โดยทางโปรแกรม (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

ตัวอย่างเช่น:

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

วิธีการเริ่มต้นจุดเริ่มต้นดั้งเดิมจาก UIViewController รอง?
ooxio

@ooxio: คุณสามารถเก็บจุดเข้าใช้ดั้งเดิมในสถานที่ส่วนกลางจากนั้นใช้ในภายหลัง
Chengjiong

นี้จะเป็นประโยชน์จริงๆถ้าคุณต้องการที่จะยกตัวอย่างที่จะเข้าสู่ระบบ / ลงทะเบียนหรือสิ่งที่ต้องการ ...
น้ำผึ้ง

นี่เป็นคำตอบที่ตรงไปตรงมามากกว่าคำตอบของ @ Travis ข้างต้นเพราะคุณไม่ต้องไปยุ่งกับการตั้งค่าโครงการและการซ่อมใน IB ใครสนใจว่าตัวควบคุมมุมมองของคุณเป็นใครในทางเทคนิคแล้วค่าเริ่มต้น VC เริ่มต้นจากนั้นคุณเปลี่ยนเส้นทางไปเป็นอีกทางหนึ่งโดยทางโปรแกรม
Danny

โปรดทราบว่าตัวควบคุมมุมมองเริ่มต้นที่กำหนดโดยกระดานเรื่องราวที่แทนที่จะยังคงได้รับอินสแตนซ์และผ่านinit()/ deinit()รอบ แต่ไม่มีการดำเนินการviewDidLoad()หรือเริ่มต้นอย่างถูกต้องIBOutlet-s ตรวจสอบให้แน่ใจว่าโค้ดของคุณพร้อมแล้ว
แกรี่

14

Swift 3:อัพเดทเป็นรหัสของ @ 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
}

ขอบคุณ @MEK นอกจากนี้คุณอาจต้องการแก้ไขไวยากรณ์ของคำสั่งปิดตามเงื่อนไขโดยแทนที่วงเล็บต่อท้ายด้วยวงเล็บปีกกา
Native_Mobile_Arch_Dev

9

คุณสามารถตั้งค่า Navigation rootviewcontroller เป็นคอนโทรลเลอร์มุมมองหลัก แนวคิดนี้สามารถใช้สำหรับการเข้าสู่ระบบอัตโนมัติตามความต้องการของแอปพลิเคชัน

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

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

ขอบคุณ


6

เปิด mainstoryboard เลือกมุมมองที่คุณต้องการเริ่มต้นจากนั้นเปิดโปรแกรมอรรถประโยชน์ -> คุณสมบัติ ใต้ปุ่ม "View Controller" คุณจะเห็นปุ่มตัวเลือก "Is initial View Controller" เพียงแค่เลือกมัน

--- เพื่อแก้ไขคำถาม:

อาจเป็นไปได้ที่คุณจะลองทำสิ่งนี้: เขียนวิธีการในส่วน ViewDidLoad ของมุมมอง inital ของคุณและเมื่อวิธีนั้นทำงานเมื่อเรียกใช้แอปพลิเคชัน


ฉันเขียนวิธีใน ViewDidLoad แต่มันไม่ทำงานและเมื่อฉัน wright ใน viewdidAppear มันใช้งานได้คุณช่วยอธิบายว่าทำไมสิ่งนี้ถึงเกิดขึ้น
UserDev

คุณอาจลองใช้วิธีนี้: เพิ่มรหัสต่อตามเงื่อนไขของคุณไปยังหนึ่งในวิธีการที่เหมาะสมในไฟล์ appDelegate.m ตัวอย่างเช่นคุณสามารถเพิ่มรหัส segue ไปยังวิธีการ "applicationDidBecomeActive:"
m.etka

@Jagdev คุณเขียนใน ViewDidAppear แทน ViewDidLoad
Umair Khan Jadoon

ปัญหาด้วยวิธีนี้คือตัวควบคุมมุมมองเริ่มต้นจะปรากฏให้เห็นเป็นระยะเวลาหนึ่งแล้วเปลี่ยนไปใช้โหมดอื่นซึ่งไม่ดีจากมุมมอง UX ดังนั้นจึงไม่ใช่ทางออกที่ดี
vishal dharankar

3

สวิฟท์ 5

หากคุณไม่ได้ตั้ง ViewController เป็น ViewController เริ่มต้นในกระดานเรื่องราวคุณต้องทำ 2 สิ่ง:

  1. ไปที่เป้าหมายของโครงการของคุณเลือกโครงการของคุณ -> ทั่วไป -> ล้างฟิลด์ส่วนติดต่อหลัก
  2. ในโครงการเป้าหมายเสมอไปที่ Info -> Application Scene Manifest -> Scene Configuration -> Application Session Role -> Item0 (การกำหนดค่าเริ่มต้น) -> ลบฟิลด์ชื่อกระดานเรื่องราว

สุดท้ายคุณสามารถเพิ่มรหัสของคุณใน 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()

}

นี่เป็นคำตอบล่าสุดของ Xcode 11.5 และแน่นอนFailed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not setคำเตือนที่ฉันมีหลังจากที่ฉันตัดสินใจที่จะยกตัวอย่าง VC เริ่มต้นของฉันในรหัส จุดสำคัญเมื่อ @ rs7 บอกว่า "ลบฟิลด์ชื่อสตอรี่บอร์ด" พวกเขาหมายถึงทั้งแถวของการวางแผนไม่ใช่แค่เนื้อหาของฟิลด์เท่านั้น
cdf1982

2

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


2

คุณสามารถตั้งค่าinitial view controllerโดยใช้ตัวสร้างส่วนต่อประสานเช่นเดียวกับโดยทางโปรแกรม

ด้านล่างเป็นวิธีการที่ใช้สำหรับการเขียนโปรแกรม

วัตถุประสงค์ -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;

รวดเร็ว:

        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

2

ฉันสร้างคลาสการเราต์เพื่อจัดการการนำทางแบบไดนามิกและรักษาคลาส AppDelegate ที่สะอาดฉันหวังว่ามันจะช่วยผู้อื่นด้วย

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

}

และใน AppDelegate ของคุณเรียกสิ่งนี้

 self.window = UIWindow(frame: UIScreen.main.bounds)
 Routing.decideInitialViewController(window: self.window!)

2

อีกวิธีการหนึ่งในการใช้Swift 3และSwift 4 ที่มีการหลีกเลี่ยงการใช้กำลังในการหล่อนั้นเป็นเช่นนี้

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
}

และด้านล่างใช้กับ 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
}

2

ในAppDelegate.swiftคุณสามารถเพิ่มรหัสต่อไปนี้:

let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "YourViewController_StorboardID")
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()

แน่นอนว่าคุณต้องใช้ตรรกะตามเกณฑ์ที่คุณเลือกตัวควบคุมมุมมองที่เหมาะสม

นอกจากนี้อย่าลืมเพิ่มตัวตน (เลือกกระดานเรื่องราว -> ฉากควบคุม -> แสดงตัวตรวจสอบตัวตน -> กำหนด StorboardID)


1

ปรับปรุงคำตอบสำหรับ iOS 13 และผู้แทนฉาก:

ตรวจสอบให้แน่ใจว่าในไฟล์ info.plist ของคุณที่คุณเข้าสู่ Application Scene Manifest -> Scene Configuration -> Application Session Role -> Item 0 และลบการอ้างอิงไปยังกระดานเรื่องราวหลักเช่นกัน มิฉะนั้นคุณจะได้รับคำเตือนแบบเดียวกันเกี่ยวกับการไม่สามารถยกตัวอย่างจากกระดานเรื่องราว

นอกจากนี้ให้ย้ายรหัสจากตัวแทนแอปไปยังฉากวิธีมอบสิทธิ์ฉาก (_: willConnectTo: ตัวเลือก :) เนื่องจากนี่คือตำแหน่งที่จัดการเหตุการณ์วงจรชีวิตตอนนี้


0

ไม่กี่วันที่ผ่านมาฉันได้พบกับสถานการณ์เดียวกัน เคล็ดลับง่าย ๆ แก้ปัญหานี้ได้ ฉันตั้งค่าตัวซ่อนมุมมองเริ่มต้นของฉันก่อนที่จะเปิดตัว 2 หากคอนโทรลเลอร์มุมมองเริ่มต้นเป็นคอนโทรลเลอร์ที่ถูกต้องระบบจะตั้งค่าให้มองเห็นได้ใน viewDidLoad มิฉะนั้นจะมีการทำข้อต่อให้กับคอนโทรลเลอร์มุมมองที่ต้องการ มันทำงานได้อย่างสมบูรณ์แบบใน iOS 6.1 ขึ้นไป ฉันแน่ใจว่าใช้งานได้กับ iOS เวอร์ชันก่อนหน้า


0

ขอบคุณที่แก้ไขสิ่งนี้ใน 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()
    }

0

พบวิธีแก้ปัญหาง่ายๆ - ไม่จำเป็นต้องลบ "การตรวจสอบมุมมองเริ่มต้น" ออกจากกระดานเรื่องราวและแก้ไขแท็บข้อมูลโครงการและใช้งานmakeKeyAndVisibleเพียงแค่วาง

self.window.rootViewController = rootVC;

ใน

- (BOOL) application:didFinishLaunchingWithOptions:

แต่คุณยังคงได้รับrootVCจากการinstantiateViewControllerWithIdentifierถูกต้องหรือไม่
thomers

0
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

อีกวิธีคือการนำเสนอ viewController

let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewController(withIdentifier: "storyBoardid") as! ViewController
self.present(vc,animated:true,completion:nil)

ก่อนอื่นคุณต้องสร้างวัตถุของสตอรี่บอร์ดของคุณจากนั้นเปลี่ยนรูท (ถ้าจำเป็น) จากนั้นคุณใช้การอ้างอิงของตัวควบคุมมุมมองเฉพาะซึ่งถูกผลักตัวควบคุมมุมมองปัจจุบัน (ถ้าคุณเปลี่ยนรูท) มิฉะนั้นมันเป็นเพียง


@VD Purohit คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับคำตอบของคุณเพื่อความเข้าใจที่มากขึ้นได้ไหม
Prags

0

Swift 4, Xcode 9

ในไฟล์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
}

0
 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**

การตรวจสอบ nsuser ค่าเริ่มต้นของการตั้งค่าค่าที่เก็บไว้อย่างสมบูรณ์และการตรวจสอบสภาพในมุมมองในมุมมอง intial ปัญหาคอนโทรลเลอร์
charles

0

Swift 5 หรือสูงกว่า # ให้ตัวควบคุมมุมมองเส้นทางโดยรหัสง่าย ๆ นี้ หากคุณใช้ xcode 11 หรือสูงกว่าการเริ่มต้นครั้งแรกvar window: UIWindow?ใน 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()

0

หากคุณไม่ต้องการเปลี่ยนแอปพลิเคชั่น DisFinish คุณสามารถทำเคล็ดลับต่อไปนี้:

ตั้งค่าคอนโทรลเลอร์นำทางเป็นคอนโทรลเลอร์มุมมองเริ่มต้นและกำหนดคลาส 'MyNavigationController' ให้กับมัน จากนั้นคุณสามารถปรับแต่งคอนโทรลเลอร์มุมมองรูทระหว่าง viewDidLoad - มันจะแทนที่คอนโทรลเลอร์มุมมองรูทที่คุณตั้งค่าไว้ในกระดานเรื่องราวของคุณ

class MyNavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        if !isLoggedIn() {
            viewControllers = [R.storyboard.authentication.loginView()!]
        }
    }

    private func isLoggedIn() -> Bool {
        return false
    }

}

-3

เลือกตัวควบคุมมุมมองที่คุณต้องการเปิดก่อนและไปที่ตัวตรวจสอบแอตทริบิวต์ ไปที่ฉากเริ่มต้นและตรวจสอบว่าเป็นตัวเลือกมุมมองเริ่มต้น

ตอนนี้จะเป็นตัวควบคุมมุมมองเริ่มต้นของคุณที่จะเปิดขึ้นเป็นครั้งแรกเมื่อเปิดใช้แอปพลิเคชัน

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