Навигация и панель вкладок отсутствуют при представлении контроллера представления

Я использую ярлыки на главном экране с помощью 3D Touch, и он работает хорошо, однако, как я это имею в виду, это означает, что когда ярлык выводит пользователя на определенный контроллер представления, панель вкладок и панель навигации отсутствуют.

Это мой код:

func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) -> Bool {
    var handled = false

    if let shortcutType = ShortcutType.init(rawValue: shortcutItem.type) {
        let rootViewController = window!.rootViewController

        switch shortcutType {
        case .Favourites:
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let rootController = storyboard.instantiateViewControllerWithIdentifier("favourites") as! FavouritesTableViewController
            rootController.parkPassed = DataManager.sharedInstance.getParkByName(NSUserDefaults.standardUserDefaults().stringForKey("currentPark")!)
            self.window?.rootViewController = rootController
            self.window?.makeKeyAndVisible()

            handled = true
        }
    return handled
}

Может кто подскажет, что мне нужно изменить в коде?

Это макет правого борта (отображается указатель FavouritesTableViewController):

введите описание изображения здесь

ИЗМЕНИТЬ:

Вот мой обновленный код:

@available(iOS 9.0, *)
func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) -> Bool {
    var handled = false

    if let shortcutType = ShortcutType.init(rawValue: shortcutItem.type) {
        switch shortcutType {
        case .Favourites:
            print("favourites")
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let rootController = storyboard.instantiateViewControllerWithIdentifier("favourites") as! FavouritesViewController
            rootController.parkPassed = DataManager.sharedInstance.getParkByName(NSUserDefaults.standardUserDefaults().stringForKey("currentPark")!)

            let root = UIApplication.sharedApplication().delegate as! AppDelegate
            if let navCont = root.window?.rootViewController?.navigationController {
                navCont.presentViewController(rootController, animated: true, completion: nil)
            } else {
                root.window?.rootViewController?.presentViewController(rootController, animated: true, completion: nil)
            }

            root.window?.makeKeyAndVisible()

            handled = true
        }
    }
    return handled
}

Ответ 1

Попробуйте следующее:

Получить делегата из делегата приложения:

 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

GEt контроллер, который вы хотели бы представить из раскадровки:

Controller *cont=//get the reference from storyboard either using storyboard ID

а затем сделайте свой rootview другим контроллером:

[appDelegate.window.rootViewController presentViewController:cont animated:YES completion:^{
                            DLog(@"presented your view ON TOP of the  tab bar controller");
                        }];

Swift:

  var appDelegate: AppDelegate = UIApplication.sharedApplication().delegate()
  var cont: Controller = //get the reference form storyboard
  appDelegate.window.rootViewController.presentViewController(cont, animated: true, completion: {    DLog("presented your view ON TOP of the  tab bar controller")

 })

вы можете переместить презентацию на основной поток, если вам нравится!!!!

Ответ 2

Итак, я получил решение, которое, надеюсь, будет работать для вас.

Сначала вам нужно установить экземпляр раскадровки.

  let storyboard = UIStoryboard(name: "Main", bundle: nil)

после этого вам нужно указать, где вы хотите начать навигацию.

let mynVC = storyboard.instantiateViewControllerWithIdentifier("root") as! UINavigationController

прямо сейчас вы можете установить viewcontroller, который вы хотите отобразить

let playVC = storyboard.instantiateViewControllerWithIdentifier("playVC")

Итак, теперь вы можете запустить рабочий процесс, но обратите внимание, что вы должны сделать это в завершении, подобном этому

 self.window?.rootViewController?.presentViewController(rootVC, animated: true, completion: { () -> Void in
            rootVC.pushViewController(playVC, animated: true)
        })

Итак, ваш rootViewController представит вам "rootVC", после чего ваш playVC.

Надеюсь, это поможет вам, ребята:)

Ответ 3

Проблема заключается в том, что вы устанавливаете контроллер вида (с именем: rootController) как window?.rootViewController, кроме представления rootController с помощью window?.rootViewController. Просто измените

self.window?.rootViewController = rootController

к

self.window?.rootViewController.presentViewController(rootController, animated: true, completion: nil)

Ответ 4

если вы используете его так, вы будете заменены rootview на этот диспетчер представлений. Таким образом, это будет новая персональная страница, и ее нормальная работа не будет иметь navigationController или tabbarController. Потому что у вас есть только эта новая страница в иерархии представлений. Если вы хотите представить это из rootview, вы можете попробовать

 let root=UIApplication.sharedApplication().delegate as! AppDelegate
    if let navCont=root.window?.rootViewController?.navigationController
    {
        navCont.presentViewController(viewControllerToPresent: UIViewController, animated: true, completion: nil)
    }
    else{
        root.window?.rootViewController?.presentViewController(viewControllerToPresent: UIViewController, animated: true, completion: nil)
    }