Подтвердить что ты не робот

Представление ViewController с помощью NavigationViewController swift

У меня есть система "NavigationViewController → MyViewController", и я программно хочу представить MyViewController внутри третьего контроллера представления. Проблема в том, что у меня нет панели навигации в MyViewController после ее представления. Вы можете мне помочь?

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

Ответ 1

Вызов 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)

Имейте в виду, что эта опция не будет автоматически включать кнопку "назад". Вам нужно будет сам построить механизм.

Какой из них лучше всего подходит для вас - это вопрос дизайна интерфейса для человека, но он обычно понимает, что имеет наибольший смысл.

Ответ 2

SWIFT 3

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

Ответ 3

Моя панель навигации не отображалась, поэтому я использовал следующий метод в 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)

Ответ 4

Я использовал расширение для UIViewController и структуру, чтобы убедиться, что мое текущее представление представлено из избранных

1. Создать для глобального Bool

struct PresentedFromFavourites {
static var comingFromFav = false}

Расширение 2.UIVeiwController: представлено так же, как и во втором варианте, с помощью "stefandouganhyde - Вариант 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
    }

}}

Ответ 5

Принятый ответ великолепен. Это не ответ, а просто иллюстрация проблемы.

Я представляю 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)
}