113

Tôi muốn đặt trình điều khiển xem ban đầu từ appdelegate. Tôi đã tìm thấy một câu trả lời thực sự tốt, tuy nhiên đó là trong Mục tiêu C và tôi gặp khó khăn trong việc đạt được điều tương tự trong nhanh chóng.

Lập trình đặt trình điều khiển chế độ xem ban đầu bằng Storyboards

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

Bất cứ ai có thể giúp đỡ?

Tôi muốn Trình điều khiển ban đầu phụ thuộc vào một số điều kiện được đáp ứng bằng cách sử dụng câu lệnh có điều kiện.

|
244

Tôi đã sử dụng chủ đề này để giúp tôi chuyển đổi mục tiêu C sang swift và nó hoạt động hoàn hảo.

Khởi tạo và trình bày một viewContoder trong 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
}

3 Swift :

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

    không thể tìm thấy bảng phân cảnh "Chính", cũng như "Bảng phân cảnh" trong ứng dụng swift 2

    – Trịnh Thi Xuân 00:36:17 31/10/2015
  • 1

    Đây có phải là cách tiêu chuẩn hiện tại để đặt bộ điều khiển xem ban đầu trong appdelegate ? Tôi yêu cầu bởi vì nó trông giống như một chút hack (xin lỗi @Abs).

    – Ngô Ðăng Khoa 23:43:32 11/01/2016
  • 1

    @rigdonmr Nếu ứng dụng có Storyboard được đặt làm Giao diện chính, cửa sổ sẽ được tải tự động và bộ điều khiển chế độ xem gốc của nó được đặt thành bộ điều khiển xem ban đầu của bảng phân cảnh. Nếu bộ điều khiển khung nhìn cần thay đổi dựa trên một điều kiện hoặc ứng dụng không có Giao diện chính, có thể chấp nhận khởi tạo a UIWindowvà đặt bộ điều khiển chế độ xem gốc của nó theo chương trình.

    – Bùi Thúy Loan 22:41:22 14/01/2016
  • 1

    Điều đáng ngạc nhiên (nhưng tốt) ở đây là việc khởi tạo trình điều khiển chế độ xem theo cách thủ công theo cách này dường như ngăn iOS khởi tạo trình điều khiển chế độ xem mặc định. Tôi có thể đã dự kiến ​​cả hai sẽ được tải. Là hành vi này được ghi nhận ở đâu đó?

    – Phan Hồng Xuân 14:56:32 13/09/2016
  • 1

    @MayankJain điều này hoạt động tốt với Swift 3, chỉ cần dịch một số mã từ swift trước đó

    – Dương Việt Ngọc 00:54:05 22/10/2016
40

Thử đi. Ví dụ: Bạn nên sử dụng UINavigationControllerlàm bộ điều khiển xem ban đầu. Sau đó, bạn có thể đặt bất kỳ trình điều khiển xem nào làm gốc từ bảng phân cảnh.

 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
}

Xem màn hình bảng phân cảnh của tôi.

|
21

Đối với Swift 3, Swift 4:

Khởi tạo trình điều khiển xem gốc từ bảng phân cảnh:

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
    }

Nếu bạn muốn sử dụng UINavigationControllernhư root:

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
    }

Khởi tạo trình điều khiển xem gốc từ xib:

Nó gần giống nhau, nhưng thay vì các dòng

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

bạn sẽ phải viết

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

nếu bạn không sử dụng bảng phân cảnh, bạn có thể thử điều này

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

Đây là một cách tốt để tiếp cận nó. Ví dụ này đặt bộ điều khiển điều hướng làm bộ điều khiển xem gốc và đặt bộ điều khiển xem bạn chọn trong phần dưới cùng của ngăn điều hướng, sẵn sàng để bạn đẩy bất cứ thứ gì bạn cần từ nó.

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

Để làm cho ví dụ này hoạt động, bạn sẽ đặt "MainViewContoder" làm ID Storyboard trên bộ điều khiển khung nhìn chính của bạn và tên tệp của bảng phân cảnh trong trường hợp này sẽ là "MainStoryboard.storyboard". Tôi đổi tên bảng phân cảnh của mình theo cách này vì Main.storyboard đối với tôi không phải là một tên thích hợp, đặc biệt nếu bạn đã từng đi đến lớp con nó.

|
11

tôi đã thực hiện nó trên mục tiêu-c hy vọng nó sẽ hữu ích cho bạn

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

Swift 4:

Thêm các dòng này bên trong AppDelegate.swift, trong hàm 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
}

Bây giờ, ví dụ, nhiều lần chúng ta làm điều gì đó như thế này khi chúng ta muốn đưa người dùng đến màn hình đăng nhập hoặc màn hình thiết lập ban đầu hoặc quay lại mainScreen của ứng dụng, v.v. , bạn có thể sử dụng điểm này như một ngã ba đường cho điều đó.

Hãy suy nghĩ về nó. Ví dụ, bạn có thể có một giá trị được lưu trữ trong NSUserDefaults chứa userLoggedIn Boolean vàif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }

|
6

Tôi đã thực hiện trong Xcode 8 và swift 3.0 hy vọng nó sẽ hữu ích cho bạn và nó hoạt động hoàn hảo. Sử dụng mã sau:

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
}

Và nếu bạn đang sử dụng bộ điều khiển điều hướng, thì hãy sử dụng đoạn mã sau cho điều đó:

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

Vâng tất cả các câu trả lời trên / dưới đây đang đưa ra một cảnh báo về việc không có điểm vào trong bảng phân cảnh.

Nếu bạn muốn có 2 (hoặc nhiều hơn) bộ điều khiển xem mục nhập phụ thuộc vào một số điều kiện (giả sử điều kiện biến đổi ) thì điều bạn nên làm là:

  • Trong Main.storyboard của bạn, hãy tạo UINavestionControll mà không cần rootViewControll, đặt nó làm điểm vào
  • Tạo 2 (hoặc nhiều hơn) "Hiển thị" các phân tách vào bộ điều khiển xem, gán cho chúng một số id, nói id1id2
  • Sử dụng mã tiếp theo:

    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
       }

Hi vọng điêu nay co ich.

|
  • 1

    lỗi "không có điểm vào trong bảng phân cảnh" là do cấu hình dự án có thể bị xóa. đi đến dự án> thông tin> thuộc tính mục tiêu iOS tùy chỉnh và xóa thuộc tính "Tên cơ sở tệp bảng phân cảnh chính". Cảnh báo sẽ không còn xuất hiện.

    – Dương Kim Bảo 13:25:42 12/09/2016
3

Đối với nhanh 4.0 .

Trong tệp AppDelegate.swift của bạn trong phương thức didfinishedlaunchingWithOptions , hãy đặt đoạn mã sau.

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
}

Hy vọng nó sẽ hoạt động tốt.

|
  • 1

    Đã hoạt động .. Nếu bạn chưa thiết lập chế độ xem ban đầu Trình điều khiển trong stroyboard thì bạn phải thêm window = UIWindow (frame: UIScreen.main.bound)

    – Ngô Hữu Minh 07:06:11 22/01/2019
3

Đây là giải pháp hoàn chỉnh trong Swift 4 thực hiện điều này trong 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")

    }
}

viết hàm này bất cứ nơi nào bên trong 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()
}
|
2

Chỉ trong trường hợp bạn muốn làm điều đó trong trình điều khiển chế độ xem chứ không phải trong đại biểu ứng dụng: Chỉ cần tìm tham chiếu đến AppDelegate trong trình điều khiển chế độ xem của bạn và đặt lại đối tượng cửa sổ của nó với trình điều khiển chế độ xem bên phải như trình điều khiển gốc.

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()
|
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 !
|
0

Nếu bạn không sử dụng bảng phân cảnh. Bạn có thể khởi tạo trình điều khiển khung nhìn chính của mình theo chương trình.

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

Và cũng loại bỏ Mainkhỏi Thông tin triển khai .

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

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.