1

よくわかりません。最初のビューを開くBarItemを備えたナビゲーションコントローラーがあります。いくつかの作業が完了したら、このビューを非表示にして、2番目のビューを開きたいと思います。

  • ルートビュー:ナビゲーションコントローラー
  • 最初のビュー:アクティビティインジケーター。一部のデータがまとめられています。
  • 2番目のビュー: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];

これは正常に機能します。しかし、-2番目のビューを開くにはどうすればよいですか?

私はこれを試しました:

2番目のビューを開きます。2番目のビューを閉じた後、最初のビューが再びポップアップし(まだそこにあるため)、この時点で閉じられます。このコードは最初のビューに配置されます。

- (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];
    }    
}

最初のビューが再びポップアップするので、2番目のビューが閉じられた後、ユーザーはインジケーターをもう一度見ることができます-それは私が望んでいることではありません。

ここで何が欠けていますか?これを行うためのより良い方法は何でしょうか?

4

1 に答える 1

0

私はこのようなことをします。NavigationControllerを作成し、最初のビューをルートコントローラーとして作成します。次に、次のようなことを行います。

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];
}

次に、2番目のビューで:

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の新しいルートビューになります。

self.navigationController.viewControllers

navcontrollersスタックにあるすべてのViewControllersを含む配列です。最初のオブジェクトはルートコントローラーです。配列全体を独自の配列に置き換えると、1つの項目しか認識されません。それがあなたが望むものであるならば、あなたは却下することによって戻ることができます。これはそれを行うための最も美しい方法ではありませんが、最悪でもありません。

于 2012-09-04T12:03:45.880 に答える