Вот моя цель: я хотел бы показать UIImagePickerController из TabBarController, и после того, как фотография сделана, я хочу, чтобы кнопка «Использовать» открыла мне другой контроллер представления.
Моя проблема: у меня естьMainCameraTabController, который наследуется от UIViewController и служит классом, который управляет запуском UIImagePickerController и делегата средства выбора.Когда выбор завершен, я пытаюсь запустить другой ViewController, отличный от MainCameraTabController, но я получаю сообщение об ошибке:
*** Assertion failure in -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:
Если я выставлю временную задержку между тем, когда UIImagePickerController будет закрыт, и тем, когда я запускаю следующий контроллер, это работает хорошо, но я бы хотел сделать это более элегантно.
Есть ли лучший способ структурировать наследование моего класса, чтобы я мог иметь MainCameraTabController для отображения средства выбора и затем второго контроллера представления?
// #
// # 1. Create the tab bar and add the MainCameraTabController:
// #
// tab1Controller and tab3Controller are also created
cameraTabController = [[MainCameraTabController alloc] init];
tabBarController = [[UITabBarController alloc] init];
NSArray *tabViewControllers = [NSArray arrayWithObjects:tab1Controller,
cameraTabController
tab3Controller, nil];
tabBarController.viewControllers = tabViewControllers;
self.window.rootViewController = self.tabBarController;
// #
// # 2. MainCameraTabController interface & implementation
// #
@interface MainCameraTabController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
{
}
- (void)showCamera;
@end
@implementation MainCameraTabController
// #
// # 3. Show the camera when the view loads
// #
- (void)viewDidLoad
{
[self startCameraController:self usingDelegate:self];
}
- (void)showNextController
{
FollowupController *fc = [[FollowupController alloc] initWithNibName:@"SomeView" bundle:nil];
// THIS IS THE PROBLEM
[self presentModalViewController:cameraPicker animated: YES];
}
- (BOOL)startCameraController:(UIViewController *)controller
usingDelegate:(id <UIImagePickerControllerDelegate, UINavigationControllerDelegate>)pickerDelegate
{
UIImagePickerController *cameraPicker = [[UIImagePickerController alloc] init];
// configure the cameraPicker
// #
// # Apple's doc specifies that UIImagePickerController must be launched with
// # presentModalViewController
// #
[controller presentModalViewController:cameraPicker animated: YES];
}
// UIImagePickerControllerDelegate method called when photo taking is finished
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
// work to handle the photo
// Dismiss the picker
[[picker parentViewController] dismissModalViewControllerAnimated: YES];
[picker release];
[self showNextController];
}
@end
И в соответствующей заметке я проверил, что такое parentViewController средства выбора, когда вызывается
imagePickerController: didFinishPickingMediaWithInfo
, и родительский объект не является MainCameraTabController, а вместо этого UITabBarCar.Не уверен, почему это так.