Навигация и панель вкладок отсутствуют при представлении контроллера представления
Я использую ярлыки на главном экране с помощью 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)
}