簡體   English   中英

使用NavigationViewController swift呈現ViewController

[英]presenting ViewController with NavigationViewController swift

我有系統“NavigationViewController - > MyViewController”,我編程想要在第三個視圖控制器中呈現MyViewController。 問題是我在呈現它之后在MyViewController中沒有導航欄。 你能幫助我嗎?

var VC1 = self.storyboard.instantiateViewControllerWithIdentifier("MyViewController") as ViewController
self.presentViewController(VC1, animated:true, completion: nil)

調用presentViewController在現有導航堆棧之外以模態 presentViewController呈現視圖控制器; 它不包含在您的UINavigationController或任何其他內容中。 如果您希望新視圖控制器具有導航欄,則有兩個主要選項:

選項1.將新視圖控制器推送到現有導航堆棧,而不是以模態方式呈現:

let VC1 = self.storyboard!.instantiateViewControllerWithIdentifier("MyViewController") as! ViewController
self.navigationController!.pushViewController(VC1, animated: true)

選項2.將新視圖控制器嵌入到新的導航控制器中,並以模態方式顯示新的導航控制器:

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)

請記住,此選項不會自動包含“后退”按鈕。 你必須自己建立一個緊密的機制。

哪個最適合您的是人機界面設計問題,但通常清楚哪些是最有意義的。

SWIFT 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)

我使用了UIViewController的擴展和一個結構來確保我的當前視圖是從收藏夾中顯示的

1.構建全球Bool

struct PresentedFromFavourites {
static var comingFromFav = false}

2.UIVeiwController擴展:通過“stefandouganhyde - Option 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
    }

}}

接受的答案很棒。 這不是答案,只是對問題的說明。

我提出了一個像這樣的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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM