21

我有navigationController,它显示为modalview,它的rootviewcontroller 是FirstViewController。有时我想将navigationController 的rootviewcontroller 更改为SecondViewController。我所做的是

[self.navigationController initWithRootViewController:SecondViewController];

我不确定我所做的是否正确以及 FirstViewController 是否被释放?请任何人知道这样做的正确方法是什么?

提前致谢!

4

5 回答 5

46

做任何一个

[firstViewController.navigationController setViewControllers: [NSArray arrayWithObject: secondViewController] 
                                                    animated: YES];

或者

firstViewController.navigationController.viewControllers = [NSArray arrayWithObject: secondViewController];

其中分别firstViewController是类的实例FirstViewController和类secondViewController的实例SecondViewController。后一种变体是setViewControllers:animated:没有动画的快捷方式。

于 2012-04-19T09:58:02.013 回答
1
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController {

     UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController];
     [UIApplication sharedApplication].delegate.window.rootViewController=navController; 
}     
于 2016-01-20T09:16:10.543 回答
0

您需要制作自定义 UINavigationController

@interface mySwitchRootViewNavigationController()

@property (nonatomic, retain) myFirstViewController * FirstViewController;
@property (nonatomic, retain) mySecondViewController * SecondViewController;

@end

- (void)viewDidLoad
{
  [super viewDidLoad];
  self.FirstViewController = [[myFirstViewController alloc] init];
  self.SecondViewController = [[mySecondViewController alloc] init];
}

-(void) setRootViewControllerWithID:(int) viewControllerID
{
  if (viewControllerID == 1) {
    self.viewControllers = [NSArray arrayWithObject:self.SecondViewController];
  } else
  {
    self.viewControllers = [NSArray arrayWithObject:self.FirstViewController];
  }
}

-(void)viewWillAppear:(BOOL)animated
{
  [self setRootViewControllerWithID:intVar];
  [super viewWillAppear:animated];
}

初始化

mySwitchRootViewNavigationController * switchView = [mySwitchRootViewNavigationController alloc] init];
于 2013-10-02T08:08:43.437 回答
0

这不是正确的方法,init很少调用已经初始化的对象(我认为永远不会)。

我解决这个问题的方法是创建 UINavigationController 的子类。

在这个子类中,我覆盖initwithrootviewcontroller:

- (id) initWithRootViewController:(UIViewController *)rootViewController
{
    UIViewController *fakeController = [[[UIViewController alloc] init] autorelease];

    self = [super initWithRootViewController:fakeController];
    if(self)
    {
        self.fakeRootViewController = fakeController;
        rootViewController.navigationItem.hidesBackButton = YES;

        [self pushViewController:rootViewController animated:NO];
    }
    return self;
}

fakeRootViewController 实际上什么都不做,这是 iOS 无法设置 rootviewcontroller 的一种解决方法。

在另一个函数(setRootViewController:aViewController)中,您隐藏了新的“rootviewcontroller”的后退按钮,因此用户永远不会看到有一个假的 rootviewcontroller。然后把它推到 fakerootviewcontroller 上面

poptorootviewcontroller 应该被覆盖以确保它总是弹出到堆栈的索引 1,而不是索引 0。

viewcontroller 的 getter 应该改变,所以它返回一个没有 fakerootviewcontroller ( removeobjectatindex: 0)的数组

希望这可以帮助!

于 2012-04-19T10:06:43.943 回答
0

斯威夫特 3

fileprivate func changeRootVC() {
        if let newVC  = self.storyboard?.instantiateViewController(withIdentifier: "MyStoryboardID"), let nc = self.navigationController {
            nc.setViewControllers([newVC], animated: true)
        }

    }
于 2017-02-10T11:31:26.463 回答