Установите rootViewController для UINavigationController с помощью метода, отличного от initWithRootViewController

Как мне установить rootViewController для UINavigationController другим методом, кроме initWithRootViewController?

Я хочу использовать initWithNavigationBarClass:toolbarClass: для доставки настраиваемой панели инструментов для моего NavigationController, поэтому не думаю, что смогу использовать initWithRootViewController.


person drc    schedule 25.04.2013    source источник
comment
Я только что обнаружил один подход: [navigationController setViewControllers: [NSArray arrayWithObject: (Указатель на контроллер представления, который должен быть корневым контроллером представления)]]; это лучший способ? Я предполагаю, что вы должны вызывать это только в файле AppDelegate в методе делегата didFinishLaunching, поскольку это кажется рискованным вмешательством в массив контроллера представления UINavigationController после этого   -  person drc    schedule 25.04.2013


Ответы (4)


Вы можете решить эту проблему, позвонив setViewControllers.

Нравится:

UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:[UIToolbar class]];

[navigationController setViewControllers:@[yourRootViewController] animated:NO];

Быстрая версия:

let navigationController = UINavigationController(navigationBarClass: MyNavigationBar.self, toolbarClass: UIToolbar.self)

navigationController.setViewControllers([yourRootViewController], animated: false)
person Leon Lucardie    schedule 25.04.2013
comment
Спасибо за подтверждение. Это может потребоваться в отдельном вопросе, но я предполагаю, что initWithNav .. означает, что все мои панели инструментов будут иметь тот же вид, который я установил в настраиваемом подклассе. Как мне тогда использовать разные стили панелей инструментов для разных разделов моего приложения? Могу ли я вернуть разные панели инструментов из этого настраиваемого подкласса? Или есть подход получше? - person drc; 25.04.2013
comment
Для этого вы можете использовать navigationController.navigationBar.tintColor = [UIColor blackColor]; или, как вы хотите, стилизовать его в -(void)viewDidAppear:animated: методах ваших ViewControllers. - person Leon Lucardie; 25.04.2013
comment
Значит, это переопределит тот факт, что в моем подклассе UIToolBar я переопределяю drawRect и устанавливаю собственный фон? Вот как я это реализую: UIImage * backgroundImage = [UIImage imageNamed: @ UIToolBar_Background.png]; [backgroundImage drawInRect: CGRectMake (0, 0, self.frame.size.width, self.frame.size.height)]; - person drc; 25.04.2013
comment
Я не уверен, переопределяет ли он столько же, сколько drawRect настройку, но это метод по умолчанию для переопределения UIToolbar свойств UINavigationController. - person Leon Lucardie; 25.04.2013
comment
Любые идеи по этому последующему вопросу я опубликовал по проблеме, с которой я сталкиваюсь. stackoverflow.com/questions/16215981/ - person drc; 25.04.2013

Обмен знаниями с помощью Swift:

Изменение контроллера корневого представления из класса, отличного от приложения delegate.swift

let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var homeViewController = mainStoryboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
let nav = UINavigationController(rootViewController: homeViewController)
appdelegate.window!.rootViewController = nav

Надеюсь, это кому-то поможет.

Отредактировано:

Изменить rootviewcontroller с помощью анимации можно с помощью:

 UIView.transitionWithView(self.window!, duration: 0.5, options: UIViewAnimationOptions.TransitionFlipFromLeft, animations: {
    self.window?.rootViewController = anyViewController
}, completion: nil)

Мы можем написать метод обобщения, тоже похожий на this.

person Arvind    schedule 25.04.2015
comment
привет @Arvind, можешь мне сказать, где лучше всего разместить этот код? Должен ли он быть в верхней части AppDelegate.swift, чтобы переменные были доступны глобально? Или, возможно, он должен быть где-то внутри класса, поскольку он создает экземпляры представлений? Благодарность - person FireDragon; 10.10.2015
comment
Да, вы можете использовать приложение at func (application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) - ›Bool. Кроме того, что вы можете на любом контроллере представления. как вам может потребоваться, когда вы попросите выйти из системы. - person Arvind; 12.10.2015
comment
@Arvind как бороться с анимацией? Анимация не отображается, и rootView отображается мгновенно. - person Engnyl; 13.10.2015
comment
@Engnyl: Я обновил ответ. Спасибо за ваш запрос, который делает его более актуальным. - person Arvind; 13.10.2015
comment
получение nil на self.navigationController - person Wasim Ahmed; 18.08.2017
comment
Этот вопрос: Установите rootViewController для UINavigationController с помощью метода, отличного от initWithRootViewController, и ваш ответ использовать initWithRootViewController? Почему? - person Andrew Paul Simmons; 20.05.2019
comment
Этот ответ изменяет контроллер корневого представления всего окна. Вопрос, в частности, требует установить контроллер корневого представления для одного контроллера навигации. - person Leon Lucardie; 09.11.2019

этот работает для меня, надеюсь, он вам поможет,

let rootVC:LoginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as! LoginViewController
let nvc:UINavigationController = self.storyboard?.instantiateViewControllerWithIdentifier("RootNavigationController") as! UINavigationController
nvc.viewControllers = [rootVC]
UIApplication.sharedApplication().keyWindow?.rootViewController = nvc
person Patel Jigar    schedule 15.08.2016
comment
ты спас мне день! - person atom2ueki; 17.02.2017
comment
получение nil на self.navigationController - person Wasim Ahmed; 18.08.2017
comment
@WasimAhmed, что означает, что у вас нет контроллера навигации в качестве контроллера корневого представления - person Patel Jigar; 29.08.2017

В Swift 3.0 xcode8.1

в общих настройках удалите в Main Interface: Main ‹-это после Main Interface:

class AppDelegate...

 var window: UIWindow?

    fun application...

      window = UIWindow(frame: UIScreen.main.bounds)
      window?.makeKeyAndVisible()
      window?.rootViewController = UINavigationController(rootViewController: NewYourController)
person Anton Russia    schedule 01.11.2016
comment
Это не отвечает на вопрос. Вы вызываете initWithRootViewController, именно то, что спрашивает, как избежать. - person Robin Daugherty; 26.11.2020