Вождение UIImagePickerController из UITabBarController - PullRequest
1 голос
/ 18 марта 2011

Вот моя цель: я хотел бы показать 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.Не уверен, почему это так.

1 Ответ

0 голосов
/ 18 марта 2011

Из-за анимации при закрытии вида вам нужно задержать завершение анимации, прежде чем она сможет выполнить следующую анимацию.Вы можете решить эту проблему, установив animated в NO.Это обрежет анимацию и немедленно выполнит следующую.

Для представлений у меня был похожий опыт, который я сделал, чтобы переключить последовательность представлений.Я запустил представление, которое я хочу показать после средства выбора, в методе viewDidload, я создал и отобразил средство выбора, поэтому после того, как средство выбора отклонено, оно покажет представление, которое я хочу.Если вы хотите, чтобы они выглядели естественно, вы всегда можете поиграть со свойством hidden представления, чтобы сгладить поток.

...