Встановити rootViewController для UINavigationController способом, відмінним від initWithRootViewController


76

Як я встановлюю rootViewControllerз UINavigationControllerіншим способом , ніж initWithRootViewController?

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


Одним із підходів, який я щойно виявив, є: [navigationController setViewControllers: [NSArray arrayWithObject: (Вказівник на контролер перегляду, який повинен бути контролером кореневого перегляду)]]; це найкращий спосіб? Я припускаю, що ви повинні викликати це лише у файлі AppDelegate у методі делегата didFinishLaunching, оскільки здається ризикованим возитися з масивом контролера перегляду UINavigationController після цього
drc

Відповіді:


144

Ви можете вирішити це, зателефонувавши setViewControllers.

Подобається це:

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

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

Swift версія:

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

navigationController.setViewControllers([yourRootViewController], animated: false)

Дякуємо за підтвердження. Можливо, це потрібно буде розглянути в окремому питанні, але я припускаю, що initWithNav .. означає, що всі мої панелі інструментів будуть мати той самий вигляд, який я встановив у спеціальному підкласі. Як мені тоді створити різні стилі панелей інструментів для різних розділів мого додатка? Чи повертати різні панелі інструментів із цього користувацького підкласу? Або є кращий підхід?
drc

Для цього ви можете використовувати navigationController.navigationBar.tintColor = [UIColor blackColor];або, як ви хочете, стилізувати його -(void)viewDidAppear:animated:методами ваших ViewControllers
Леон Лукарді

Отже, це перекриє той факт, що у своєму підкласі UIToolBar я перевизначаю drawRect та встановлюю власний фон? Ось як я реалізую це: UIImage * backgroundImage = [UIImage imageNamed: @ "UIToolBar_Background.png"]; [backgroundImage drawInRect: CGRectMake (0, 0, self.frame.size.width, self.frame.size.height)];
drc

Я не впевнений, що це перевизначає стільки, скільки drawRectналаштування, але це метод за замовчуванням для перевизначення UIToolbarвластивостей UINavigationController.
Леон Лукарді

Будь-яку ідею щодо цього подальшого запитання, яке я розмістив щодо проблеми, з якою я стикаюся stackoverflow.com/questions/16215981/…
drc

27

Обмін знаннями за допомогою 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)

Ми можемо написати метод узагальнення, занадто подібний до цього.


привіт @Arvind, ти можеш сказати мені найкраще місце для розміщення цього коду? Чи повинен він бути у верхній частині AppDelegate.swift, щоб змінні були доступні у всьому світі? Або, можливо, це має бути десь у класі, оскільки це інстанціювання поглядів? подяка
FireDragon

Так, ви можете використовувати в додатку func (додаток: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool. Крім будь-якого на будь-якому контролері перегляду. як вам може знадобитися, коли ви просите вийти.
Арвінд

@Arvind як боротися з анімацією? Анімація не відображається, а rootView відображається миттєво.
Engnyl

@Engnyl: Я оновив відповідь. Дякуємо за ваш запит, що робить його більш оновленим.
Арвінд

отримання нуля на self.navigationController
Васім Ахмед

15

цей працює для мене, сподіваюся, він допоможе вам,

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

1
ти врятував мій день!
atom2ueki

отримання нуля на self.navigationController
Васім Ахмед

@WasimAhmed, це означає, що у вас немає контролера навігації як контролера кореневого перегляду
Patel Jigar

3

У швидкому 3.0 xcode8.1

у загальних налаштуваннях видалити в Основному інтерфейсі: Основний <-це після Головного інтерфейсу:

class AppDelegate...

 var window: UIWindow?

    fun application...

      window = UIWindow(frame: UIScreen.main.bounds)
      window?.makeKeyAndVisible()
      window?.rootViewController = UINavigationController(rootViewController: NewYourController)

Це не відповідає на питання. Ви дзвоните initWithRootViewController, саме те, про що йдеться в питанні, як цього уникнути.
Робін Догерті,

-2
  let storyboard = UIStoryboard(name: "Main", bundle: nil)         
  let yourNewRootView = storyboard.instantiateViewControllerWithIdentifier("yourNewRootView") as? yourNewRootView


   self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    UIView.transitionWithView(self.window!, duration: 0.1, options: [UIViewAnimationOptions.TransitionFlipFromRight,UIViewAnimationOptions.TransitionFlipFromLeft], animations: 
    {
        // animation

        }, completion: { (finished: Bool) -> () in

            self.window?.rootViewController = nil
            self.window?.rootViewController = yourNewRootView
            self.window?.makeKeyAndVisible()
    })
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.