web-dev-qa-db-ja.com

Swift presentViewController

プログラムで、iOS Swiftプロジェクトに複数のView Controllerがあります。私は絵コンテを持っていないので、できればそれらを避けたいです。別のviewcontroller.Swiftファイル(view2.Swiftと呼びます)に切り替えて、ボタンが呼び出す関数の一部にする方法はありますか?
次のことを試しました。

let storyboard: UIStoryboard = UIStoryboard(name: "myTabBarName", bundle: nil)
let vc: UIViewController = storyboard.instantiateViewControllerWithIdentifier("myVCID") as UIViewController
self.presentViewController(vc, animated: true, completion: nil)

上記はストーリーボードで動作しますが、別のview2.Swiftを呼び出したいです。これはできますか?

68
Z-Tech

これを試して:

let vc = ViewController() //change this to your class name
self.presentViewController(vc, animated: true, completion: nil)

Swift3の場合:

self.present(vc, animated: true, completion: nil)
103
Adam

空白/黒い画面が表示される場合は、このコードが役立ちました。

    let vc = self.storyboard?.instantiateViewController(withIdentifier: myVCID) as! myVCName
    self.present(vc, animated: true, completion: nil)

「識別子」をVCに設定するには、ストーリーボードのVCのアイデンティティインスペクターに移動します。 「ストーリーボードID」を識別したいものに設定します。参考のために下の画像をご覧ください。 

91
boidkan

参考のため、この質問は最初のGoogle結果の1つです。

Swift 3の重大な変更:

メソッドpresentViewControllerは、メソッドpresentに置き換えられます。

古いもののように使用できます:

self.present(viewControllerToPresent, animated: true, completion: nil)

カメラを開く例:

let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true, completion: nil)
20
Arnlen

Swift 3およびSwift 4

let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName
self.present(vc, animated: true, completion: nil)
14
Kaptain

私にとっては、2つの別々のnavコントローラーで2つのビューがありました。上記の組み合わせを使用する必要がありました。

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

Swift 3.x

        let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "VC-ID" as! yourViewController
        let navigationVC = UINavigationController(rootViewController: secondVC)
        self.present(navigationVC, animated: true, completion: nil)
7
Keith Holliday

Swift 2.1 +を使用

 let vc = self.storyboard?.instantiateViewControllerWithIdentifier("settingsVC") as! SettingsViewController
 self.presentViewController(vc, animated: true, completion: nil)

enter image description here

6
ColossalChris

これを使用してください:nibNameを使用してください。そうしないと、事前にロードされたxibのビューが表示されません:

var vc : ViewController = ViewController(nibName: "ViewController", bundle: nil) //これをクラス名に変更します

 self.presentViewController(vc, animated: true, completion: nil)
4
Alok

Navigation Controllerを追加し、2番目のView ControllerをrootVCとして設定することにより、黒い画面を解決しました。

let vc = ViewController()       
var navigationController = UINavigationController(rootViewController: vc)
self.presentViewController(navigationController, animated: true, completion: nil
3
AMG

present() ViewControllerを機能させるためだけに、ストーリーボードでViewControllerをインスタンス化する必要はありません。それはハック的なソリューションです。

VCを表示するときに黒/空白の画面が表示される場合は、First/RootViewControllerでpresent()からviewDidLoad()を呼び出しているが、最初のビューがまだ準備されていない可能性があります。

これを修正するには、viewDidAppearからpresent()を呼び出します。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let yourVC = YourViewController()
    self.present(yourVC, animated: true, completion: nil)
}

アプリに「ビュー」が表示されたら、viewDidLoad()からpresent()の呼び出しを開始できます。


UINavigationControllerの使用(回答で提案されている)は別のオプションですが、この問題を解決するにはやり過ぎかもしれません。ユーザーフローが複雑になる可能性があります。 UINavigationControllerベースのソリューションは、NavigatonBarが必要な場合、または前のView Controllerに戻りたい場合にのみ使用してください。

1
Nitin Nain

コードを使用できます:

if let vc = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController {
   let appDelegate = UIApplication.shared.delegate as! AppDelegate
   appDelegate.window?.rootViewController = vc
}
0
tvtruong

以下のコードを使用できます:

var vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController;
            vc.mode_Player = 1
            self.presentViewController(vc, animated: true, completion: nil)
0

もう1つの可能性は、ビルドターゲットにXIBが含まれていないことです(これは私に起こったことです)。

これは、開発、テスト、およびリリースビルドのターゲットが異なる場合に発生する可能性があります(とにかく必要があります)。

0
Ger