it-swarm.com.de

präsentation von ViewController mit NavigationViewController swift

Ich habe das System "NavigationViewController -> MyViewController" und möchte MyViewController programmgesteuert in einem dritten View-Controller präsentieren. Das Problem ist, dass ich in MyViewController nach der Präsentation keine Navigationsleiste habe. Kannst du mir helfen? 

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

Beim Aufruf von presentViewController wird der View Controller modal außerhalb des vorhandenen Navigationsstapels angezeigt. es ist nicht in Ihrem UINavigationController oder einem anderen enthalten. Wenn Sie möchten, dass Ihr neuer View Controller eine Navigationsleiste hat, haben Sie zwei Hauptoptionen:

Option 1. Schieben Sie den neuen View-Controller auf Ihren vorhandenen Navigations-Stack, anstatt ihn modal darzustellen:

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

Option 2. Betten Sie Ihren neuen View Controller in einen neuen Navigationscontroller ein und stellen Sie den neuen Navigationscontroller modal dar:

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)

Beachten Sie, dass diese Option nicht automatisch eine Schaltfläche "Zurück" enthält. Sie müssen selbst einen engen Mechanismus einbauen.

Welches für Sie am besten ist, ist eine Frage zum Design von Benutzeroberflächen. Normalerweise ist jedoch klar, was am sinnvollsten ist.

167

Swift 3

let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
let navController = UINavigationController(rootViewController: VC1)
self.present(navController, animated:true, completion: nil)
12
Maksim Kniazev

Meine Navigationsleiste wurde nicht angezeigt, daher habe ich in Swift 2 iOS 9 die folgende Methode verwendet

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)
12
Vinod Joshi

Die akzeptierte Antwort ist großartig. Dies ist keine Antwort, sondern nur eine Illustration des Problems.

Ich präsentiere einen viewController wie diesen:

innerhalb von vc1:

func showVC2() {
    if let navController = self.navigationController{
        navController.present(vc2, animated: true)
    }
}

innerhalb von vc2:

func returnFromVC2() {
    if let navController = self.navigationController {
        navController.popViewController(animated: true)
    }else{
        print("navigationController is nil") <-- I was reaching here!
    }
}

Wie "stefandouganhyde" sagte: "Es ist nicht in Ihrem UINavigationController oder einem anderen enthalten."

neue Lösung:

func returnFromVC2() {
    dismiss(animated: true, completion: nil)
}
0
Honey

Ich habe eine Erweiterung für UIViewController und eine Struktur verwendet, um sicherzustellen, dass meine aktuelle Ansicht aus den Favoriten dargestellt wird

1.Struktur für einen globalen Bool 

struct PresentedFromFavourites {
static var comingFromFav = false}

2.UIVeiwController-Erweiterung: Modal wie in der zweiten Option von "stefandouganhyde - Option 2" dargestellt und Rücken gelöst

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
    }

}}
0
Atka