プログラムで、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
を呼び出したいです。これはできますか?
これを試して:
let vc = ViewController() //change this to your class name
self.presentViewController(vc, animated: true, completion: nil)
Swift3の場合:
self.present(vc, animated: true, completion: nil)
空白/黒い画面が表示される場合は、このコードが役立ちました。
let vc = self.storyboard?.instantiateViewController(withIdentifier: myVCID) as! myVCName
self.present(vc, animated: true, completion: nil)
「識別子」をVCに設定するには、ストーリーボードのVCのアイデンティティインスペクターに移動します。 「ストーリーボードID」を識別したいものに設定します。参考のために下の画像をご覧ください。
参考のため、この質問は最初のGoogle結果の1つです。
メソッド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)
Swift 3およびSwift 4
let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName
self.present(vc, animated: true, completion: nil)
私にとっては、2つの別々のnavコントローラーで2つのビューがありました。上記の組み合わせを使用する必要がありました。
var vc = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeViewController") as! WelcomeViewController
var navigationController = UINavigationController(rootViewController: vc)
self.presentViewController(navigationController, animated: true, completion: nil)
let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "VC-ID" as! yourViewController
let navigationVC = UINavigationController(rootViewController: secondVC)
self.present(navigationVC, animated: true, completion: nil)
これを使用してください:nibNameを使用してください。そうしないと、事前にロードされたxibのビューが表示されません:
var vc : ViewController = ViewController(nibName: "ViewController", bundle: nil)
//これをクラス名に変更します
self.presentViewController(vc, animated: true, completion: nil)
Navigation Controllerを追加し、2番目のView ControllerをrootVCとして設定することにより、黒い画面を解決しました。
let vc = ViewController()
var navigationController = UINavigationController(rootViewController: vc)
self.presentViewController(navigationController, animated: true, completion: nil
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に戻りたい場合にのみ使用してください。
コードを使用できます:
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = vc
}
以下のコードを使用できます:
var vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController;
vc.mode_Player = 1
self.presentViewController(vc, animated: true, completion: nil)
もう1つの可能性は、ビルドターゲットにXIBが含まれていないことです(これは私に起こったことです)。
これは、開発、テスト、およびリリースビルドのターゲットが異なる場合に発生する可能性があります(とにかく必要があります)。