システム「NavigationViewController-> MyViewController」があり、プログラムで3番目のView Controller内にMyViewControllerを表示したい。問題は、MyViewControllerに表示した後、ナビゲーションバーがないことです。手伝って頂けますか?
var VC1 = self.storyboard.instantiateViewControllerWithIdentifier("MyViewController") as ViewController
self.presentViewController(VC1, animated:true, completion: nil)
presentViewController
を呼び出すと、View Controller modallyが既存のナビゲーションスタックの外側に表示されます。 UINavigationControllerなどには含まれていません。新しいView ControllerにNavigation Barが必要な場合、2つの主なオプションがあります。
オプション1.新しいView Controllerをモーダルで表示するのではなく、既存のナビゲーションスタックにプッシュします。
let VC1 = self.storyboard!.instantiateViewControllerWithIdentifier("MyViewController") as! ViewController
self.navigationController!.pushViewController(VC1, animated: true)
オプション2.新しいView Controllerを新しいNavigation Controllerに埋め込み、新しいNavigation Controllerをモーダルモードで表示します。
let VC1 = self.storyboard!.instantiateViewControllerWithIdentifier("MyViewController") as! ViewController
let navController = UINavigationController(rootViewController: VC1) // Creating a navigation controller with VC1 at the root of the navigation stack.
self.present(navController, animated:true, completion: nil)
このオプションには「戻る」ボタンが自動的に含まれないことに注意してください。あなたは自分で密接なメカニズムを組み込む必要があります。
どちらが最適かはヒューマンインターフェイスデザインの質問ですが、通常は何が最も理にかなっているのかは明らかです。
スイフト3
let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
let navController = UINavigationController(rootViewController: VC1)
self.present(navController, animated:true, completion: nil)
ナビゲーションバーが表示されていなかったため、Swift 2 iOS 9で次のメソッドを使用しました
let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("Dashboard") as! Dashboard
// Creating a navigation controller with viewController at the root of the navigation stack.
let navController = UINavigationController(rootViewController: viewController)
self.presentViewController(navController, animated:true, completion: nil)
受け入れられた答えは素晴らしいです。これは答えではなく、問題の単なる例示です。
私はこのようなviewControllerを提示します:
vc1:内
func showVC2() {
if let navController = self.navigationController{
navController.present(vc2, animated: true)
}
}
vc2:内
func returnFromVC2() {
if let navController = self.navigationController {
navController.popViewController(animated: true)
}else{
print("navigationController is nil") <-- I was reaching here!
}
}
「stefandouganhyde」が言ったように:「それはあなたのUINavigationControllerまたは他に含まれていません」
新しいソリューション:
func returnFromVC2() {
dismiss(animated: true, completion: nil)
}
UIViewControllerの拡張機能と構造体を使用して、現在のビューがお気に入りから表示されるようにしました
1.グローバルBoolの構造
struct PresentedFromFavourites {
static var comingFromFav = false}
2.UIVeiwController拡張:「stefandouganhyde-オプション2」による2番目のオプションのようにモーダルで提示され、解決
extension UIViewController {
func returnToFavourites()
{
// you return to the storyboard wanted by changing the name
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let mainNavigationController = storyBoard.instantiateViewController(withIdentifier: "HomeNav") as! UINavigationController
// Set animated to false
let favViewController = storyBoard.instantiateViewController(withIdentifier: "Favourites")
self.present(mainNavigationController, animated: false, completion: {
mainNavigationController.pushViewController(favViewController, animated: false)
})
}
// call this function in viewDidLoad()
//
func addBackToFavouritesButton()
{
if PresentedFromFavourites.comingFromFav
{
//Create a button
// I found this good for most size classes
let buttonHeight = (self.navigationController?.navigationBar.frame.size.height)! - 15
let rect = CGRect(x: 2, y: 8, width: buttonHeight, height: buttonHeight)
let aButton = UIButton(frame: rect)
// Down a back arrow image from icon8 for free and add it to your image assets
aButton.setImage(#imageLiteral(resourceName: "backArrow"), for: .normal)
aButton.backgroundColor = UIColor.clear
aButton.addTarget(self, action:#selector(self.returnToFavourites), for: .touchUpInside)
self.navigationController?.navigationBar.addSubview(aButton)
PresentedFromFavourites.comingFromFav = false
}
}}