1

我很困惑。我有一个带有 BarItem 的导航控制器,它打开第一个视图。完成一些工作后,我希望此视图消失,并希望打开第二个视图。

  • 根视图:导航控制器
  • 第一个视图:活动指示器,将一些数据放在一起
  • 第二个视图:MFMailComposeViewController

在根视图中,BarItem 运行这些行来打开第一个视图:

    IndicatorViewController *indicator = [[IndicatorViewController alloc] initWithNibName:@"IndicatorViewController" bundle:nil];

    indicator.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentModalViewController:indicator animated:YES];

第一个视图(IndicatorViewController)做了一些工作并最终运行

[self dismissModalViewControllerAnimated:YES];

这工作正常。但是 - 我如何打开第二个视图?

我试过这个:

我打开第二个视图。关闭第二个视图后,我的第一个视图再次弹出(因为它仍然存在)并在此时被解雇。这段代码放在第一个视图中:

- (void) viewDidAppear:(BOOL)animated {
    static BOOL firstTime = YES;
    if (firstTime) {
        //do stuff that takes some time (that's why I show the indicator)
        MailViewController *controller = [[MailViewController alloc] init];

        if (controller) 
           [self presentModalViewController:controller animated:YES]; 
        firstTime = NO;
    } else {
        [self dismissModalViewControllerAnimated:YES];
    }    
}

由于第一个视图再次弹出,用户可以在第二个视图关闭后再次看到指示器 - 这不是我想要的。

我在这里想念什么?这样做的更好方法是什么?

4

1 回答 1

0

我会做这样的事情。制作一个导航控制器,并将第一个视图作为根控制器。然后做这样的事情:

FirstView.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.navigationController setNavigationBarHidden:YES];
}

- (void) nextView { // however you get to your next view, button/action/etc.
    UIViewController *screen = [self.storyboard instantiateViewControllerWithIdentifier:@"yourIdentifier"];
    [self.navigationController pushViewController:screen animated:YES];
}

然后在第二个视图中:

SecondView.m
- (void) nextView { // however you get to your next view, button/action/etc.
    UIViewController *screen = [self.storyboard instantiateViewControllerWithIdentifier:@"yourIdentifier"];
    [self.navigationController pushViewController:screen animated:YES];
}

最后在根视图中:

RootView.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSArray *navStack = [NSArray arrayWithObject:self];
    self.navigationController.viewControllers = navStack;
    [self.navigationController setNavigationBarHidden:NO];
}

这将使您的 RootView 成为 NavigationController 的新 rootview。

self.navigationController.viewControllers

是包含 navcontrollers 堆栈上的所有 ViewControllers 的数组。第一个对象是根控制器。如果我们用我们自己的数组替换整个数组,它只知道一项。如果那是您想要的,您可以通过解雇返回。这不是最漂亮的方式,但也不是最糟糕的。

于 2012-09-04T12:03:45.880 回答