Swift kullanarak bir Görüntü Kumandasından diğerine nasıl geçilir


85

Bir görünüm denetleyicisinden diğerine gitmek istiyorum. Aşağıdaki Objective-C kodunu Swift'e nasıl dönüştürebilirim?

UIViewController *viewController = [[self storyboard] instantiateViewControllerWithIdentifier:@"Identifier"];
UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController pushViewController:navi animated:YES];

Yanıtlar:


210

İkinci görünüm denetleyicisi için bir hızlı dosya (SecondViewController.swift) oluşturun ve uygun işlevde şunu yazın:

let secondViewController = self.storyboard.instantiateViewControllerWithIdentifier("SecondViewController") as SecondViewController
self.navigationController.pushViewController(secondViewController, animated: true)


Swift 2+

let mapViewControllerObj = self.storyboard?.instantiateViewControllerWithIdentifier("MapViewControllerIdentifier") as? MapViewController
self.navigationController?.pushViewController(mapViewControllerObj!, animated: true)

Swift 4

let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "IKDetailVC") as? IKDetailVC
self.navigationController?.pushViewController(vc!, animated: true)

@ audrey, Merhaba, navigationController nasıl ayarlanır?
Sanjivani

@Sanjivani, Merhaba görüntüleme denetleyiciniz Storyboard ile oluşturulabilir ve ilkViewController'ınızı rootViewController olarak atayabilirsiniz. Gezinme Denetleyicisi (swift) sınıfınız şöyle görünecek:import UIKit class SwiftNavigationController: UINavigationController { init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) // Custom initialization }`` override func viewDidLoad() { super.viewDidLoad() }
Audrey Sobgou Zebaze

3
Ben de aynı problemi yaşadım, bir ViewController'den diğerine nasıl gideceğim konusunda takılı kaldım. Bu kodu denediğimde, şu hatayı alıyorum: unexpectedly found nil while unwrapping an Optional valuekodunuzun ikinci satırında. Lütfen yardım edin
Raghavendra

1
Animated: parametresiyle ilgili şu şekilde bir sorun yaşıyorum: "İfadenin türü '$ T7 ??' dönüştürülemiyor mu? 'BooleanLiteralConvertible' "yazmak için.
Morkrom

2
Bunun çalışması için denetleyicilerinizin bir Navigasyon Denetleyicisine gömülü olduğundan emin olmanız gerekir, aksi takdirde hata alırsınız.
kakubei

35

Deneyimlerime navigationControllergöre sıfırdı, bu yüzden kodumu şununla değiştirdim:

let next = self.storyboard?.instantiateViewControllerWithIdentifier("DashboardController") as! DashboardController
self.presentViewController(next, animated: true, completion: nil)

ViewController'ı -> StoryBoard Idiçinde ayarlamayı unutmayın.StoryBoardidentity inspector


2
Bunun nedeni, görünüm denetleyicinizin Gezinme Görünümü Denetleyicisinde alçaltılmamış olmasıdır.
Francis Reynolds

18

Geri düğmesinin görünmesini istemiyorsanız (bu benim durumumdu, çünkü bir kullanıcı oturum açtıktan sonra sunum yapmak istedim), nav denetleyicisinin kökünü şu şekilde ayarlayabilirsiniz:

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController
        let navigationController = UINavigationController(rootViewController: vc)
        self.presentViewController(navigationController, animated: true, completion: nil)

16

SWIFT 3.01

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "Conversation_VC") as! Conversation_VC
self.navigationController?.pushViewController(secondViewController, animated: true)

7

Hızlı 4.0'da

var viewController: UIViewController? = storyboard().instantiateViewController(withIdentifier: "Identifier")
var navi = UINavigationController(rootViewController: viewController!)
navigationController?.pushViewController(navi, animated: true)

4

Hızlı 3

let secondviewController:UIViewController =  self.storyboard?.instantiateViewController(withIdentifier: "StoryboardIdOfsecondviewController") as? SecondViewController

self.navigationController?.pushViewController(secondviewController, animated: true)

4

Swift 4.1 ve Xcode 10'da

Burada AddFileViewController ikinci görünüm denetleyicisidir.

Film şeridi kimliği AFVC'dir

let next = self.storyboard?.instantiateViewController(withIdentifier: "AFVC") as! AddFileViewController
self.present(next, animated: true, completion: nil)

//OR

//If your VC is DashboardViewController
let dashboard = self.storyboard?.instantiateViewController(withIdentifier: "DBVC") as! DashboardViewController
self.navigationController?.pushViewController(dashboard, animated: true)

Gerekirse iplik kullanın .

Ör:

DispatchQueue.main.async { 
    let next = self.storyboard?.instantiateViewController(withIdentifier: "AFVC") as! AddFileViewController
    self.present(next, animated: true, completion: nil) 
}

Bir süre sonra taşınmak istersen .

EX:

//To call or execute function after some time(After 5 sec)
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
    let next = self.storyboard?.instantiateViewController(withIdentifier: "AFVC") as! AddFileViewController
    self.present(next, animated: true, completion: nil) 
} 

3

Hızlı 3'te

let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController        
self.navigationController?.pushViewController(nextVC, animated: true)

3
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let home = storyBoard.instantiateViewController(withIdentifier: "HOMEVC") as! HOMEVC
navigationController?.pushViewController(home, animated: true);

Swift veya Objc sözdizimi olmadığını düşünüyorum
SPatel

2
let objViewController = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.navigationController?.pushViewController(objViewController, animated: true)

Kodunuzun ne yaptığını, sorunu neden çözdüğünü ve diğer tüm yanıtlardan ne kadar farklı olduğunu kısaca açıklar mısınız?
JJJ

burada tanımlayıcı olarak storyboard kimliğini kullanıyorum. Referans (objViewController) aracılığıyla kontrolü View Controller sınıfına itin
Davender Verma

1

Swift 4

UIViewController ile gezinti denetleyicisini ayarlamanız gereken her şeyden önce gezinme denetleyicisine basarak ekranı değiştirebilirsiniz.

let vc = self.storyboard?.instantiateViewController(withIdentifier: "YourStoryboardID") as! swiftClassName

self.navigationController?.pushViewController(vc, animated: true)

1

Swift 5

Bir Görünüm Denetleyicisinden başka bir Görüntü Denetleyicisine gezinmek için Segue kullanın:

performSegue(withIdentifier: "idView", sender: self)

Bu, Xcode 10.2'de çalışır.


segment türü?
geliştirici

1

AppDelegate'te şöyle yazabilirsiniz ...

var window: UIWindow?

fileprivate let navigationCtrl = UINavigationController()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    self.createWindow()

    self.showLoginVC()

    return true
}

func createWindow() {
    let screenSize = UIScreen.main.bounds
    self.window = UIWindow(frame: screenSize)
    self.window?.backgroundColor = UIColor.white
    self.window?.makeKeyAndVisible()
    self.window?.rootViewController = navigationCtrl
}

func showLoginVC() {
    let storyboardBundle = Bundle.main
    // let storyboardBundle = Bundle(for: ClassName.self) // if you are not using main application, means may be you are crating a framework or library you can use this statement instead
    let storyboard = UIStoryboard(name: "LoginVC", bundle: storyboardBundle)
    let loginVC = storyboard.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC
    navigationCtrl.pushViewController(loginVC, animated: false)
}
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.