it-swarm.com.ru

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

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

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

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

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

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

167
stefandouganhyde

Свифт 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

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

Я использовал расширение 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
    }

}}
0
Atka