2013-04-25 3 views
55

Как установить rootViewController из UINavigationController способом, отличным от initWithRootViewController?Установить rootViewController UINavigationController, отличным от initWithRootViewController

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

+0

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

ответ

110

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

Как это:

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

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

Спасибо за подтверждение. Это может потребоваться для отдельного вопроса, но я полагаю, что initWithNav .. означает, что все мои панели инструментов будут иметь тот же внешний вид, который я задал в пользовательском подклассе. Как у меня есть разные стилизованные панели инструментов для разных разделов моего приложения? Я возвращаю различные панели инструментов из этого пользовательского подкласса? Или есть лучший подход? – drc

+0

Для этого вы можете использовать 'navigationController.navigationBar.tintColor = [UIColor blackColor];' или, тем не менее, вы хотите стилизовать его в режиме '- (void) viewDidAppear: анимированные:' методы вашего ViewControllers –

+0

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

16

Обмена знаний Использования 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 С Animation можно достичь с помощью:

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

Мы можем написать обобщать метод слишком похож на this.

+0

hi @Arvind, можете ли вы рассказать мне лучшее место для размещения этого кода? Должен ли он находиться на вершине AppDelegate.swift, чтобы переменные были доступны по всему миру? Или, возможно, он должен быть внутри класса где-то, поскольку он создает экземпляры? спасибо – FireDragon

+0

Да, вы можете использовать приложение func (приложение: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool. Кроме того, вы можете использовать любой контроллер. как вы можете потребовать, когда вы попросите выйти из системы. – Arvind

+0

@ Арвинд, как бороться с анимацией? Никакая анимация не отображается, и rootView отображается мгновенно. – Engnyl

0
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() 
    }) 
7

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

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

+1

Единственный, который работает! – Marin

+0

спасибо @ atom2ueki –

1

В стремительной 3.0 xcode8.1

в общих настройках удаляемых в главном интерфейсе: Main < -это после главного интерфейса:

class AppDelegate... 

var window: UIWindow? 

    fun application... 

     window = UIWindow(frame: UIScreen.main.bounds) 
     window?.makeKeyAndVisible() 
     window?.rootViewController = UINavigationController(rootViewController: NewYourController) 
Смежные вопросы