さて、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...
(など)
何も機能していません=/