1

ここに画像の説明を入力してください

さて、iOS 5でAppleはViewControllerコンテナを導入しました(素晴らしいです!)

上記は私のアプリのレイヤーがどのように見えるかです。TabBarにはNavControllerが含まれ、セグメント化されたコントロールによって切り替えられる2つのテーブルビューを保持するViewController(コンテナ)が含まれます。

テーブルセルを選択すると、新しいビューが簡単にプッシュされます。ただし、detailViewController内のボタンを押すと、MFMailComposeViewControllerをモーダルに表示したいと思います。これは簡単に現れ、すぐにそれ自体を却下します。私が得るエラーログは次のとおりです。

UITabBarControllerの外観遷移を開始/終了するための不均衡な呼び出し

これは、他のビューがまだ表示されている間、またはランタイムループでビューを表示しようとしていることを意味します。これを停止するために遅延を追加しようとしましたが、何も機能しません。すべてのデリゲートを追加し、すべてのライブラリを正しくインポートしました。

元のテーブルビューから新しいビューをプッシュする方法や、ビューをコンテナーにロードする方法と関係があると思います。ご存知のとおり、プロジェクトではXcodeのタブバーアプリテンプレートのベースコードを使用しています。コードは次のとおりです。

ViewController/コンテナ

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Alloc Init View Controllers
    menuDrinksViewController = [[MenuDrinksViewController alloc] init];
    menuFoodViewController = [[MenuFoodViewController alloc] init];

    // Create Parent/Child relationship
    [menuFoodViewController didMoveToParentViewController:self];
    [self addChildViewController:menuFoodViewController];

    [menuDrinksViewController didMoveToParentViewController:self];
    [self addChildViewController:menuDrinksViewController];

    [appearanceClass setBackgroundImage:self.view];

    // segmented controller
    segmentedControl = [[SVSegmentedControl alloc] initWithSectionTitles:[NSArray arrayWithObjects:@"              Eat              ", @"               Drink               ", nil]];
    [segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
    [appearanceClass setSegmentedControl:segmentedControl];
    [self.view addSubview:segmentedControl];

    //self.view.backgroundColor = [UIColor redColor];

    // Add and Size subviews
    [self.view addSubview:menuFoodViewController.view];
    menuFoodViewController.view.frame = CGRectMake(0, 39, 320, self.view.frame.size.height - 40 + 1);
    menuDrinksViewController.view.frame = CGRectMake(0, 39, 320, 327 + 1);
}


-(IBAction)segmentAction:(id)selector
{
    // it's a custom segmented control, dw bout the code.
    if (segmentedControl.selectedIndex == 0)
    {
        [self.view addSubview:menuFoodViewController.view];
        [menuDrinksViewController.view removeFromSuperview];
    }
    else if (segmentedControl.selectedIndex == 1)
    {
        [self.view addSubview:menuDrinksViewController.view];
        [menuFoodViewController.view removeFromSuperview];
    }

}

TableViewController

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MenuFoodDetailViewController *menuFoodDetailViewController = [[MenuFoodDetailViewController alloc] initWithNibName:nil bundle:nil];
    //MenuFoodDetailViewController *menuFoodDetailViewController = [[MenuFoodDetailViewController alloc] init];

    [self.parentViewController.navigationController pushViewController:menuFoodDetailViewController animated:YES];
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}

詳細ビューコントローラからのButtonPressコード。

- (void)showMailComposer
{
    // attempt to delay the presentModalView call, doesnt work...
    double delayInSeconds = 0.1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self.navigationController presentModalViewController:mailComposeViewController animated:YES];
    });
}

私はこれが質問することがたくさんあることを知っています、しかし私は何日もこれにいました。ビューに関連付けられていないすべてのコード、つまりMFMailViewComposerは正常に機能します。他のアプリでテストしましたが、

私は新しいモーダルビューをプッシュするためにあらゆる種類のバリエーションを試しました、すなわち self.parentViewController.navigationController presentModal...(など)

何も機能していません=/

4

2 に答える 2

3

iOS5内のバグであることが判明しました。別のプロジェクトでコードを再作成した後、それは機能しました。そこで、問題をiOS5の外観カスタマイズプロトコルにトレースしました。UINavigationBar内でフォントを変更しようとすると、MFMailComposeViewController内およびiOS6内の別のモーダルビュー内でエラーが発生します。

Appleにレーダーを提出しました

于 2012-07-29T14:53:29.323 に答える
0

2日前と同じ問題がありました。

これを試して..

'detailViewController'のボタンを押すと、MFMailComposeViewControllerをモーダルに表示しようとしています。

したがって、例外がスローされる理由の1つは、MFMailComposeViewControllerをモーダルに表示するとすぐに「detailViewController」の割り当てが解除されるためです。したがって、MFMailComposeViewControllerは「detailViewController」に戻ることができませんでした。

'detailViewController'で自動リリースを使用したかどうかを確認するか、'detailViewController'のデストラクタにブレークポイントを設定してデバッグします。

于 2012-07-26T22:58:22.940 に答える