2010-09-16 2 views
1

Есть ли способ вызвать код, когда модальное представление завершено?Уведомление UIView, когда модальный UIImagePickerController уволен?

EDIT:

Мне очень жаль, я не уточнил ранее. Я пытаюсь отклонить UIImagePickerController, а затем показать MFMailComposeViewController и прикрепить данные изображения к электронной почте. Когда я пытаюсь вызвать

[self presentModalViewController: mailController]

сразу после

[self dismissModalViewController];

я получаю ошибки и тому подобное.

+0

См. Мой ответ для обновления. –

ответ

5

Вы используете шаблон делегата для модального просмотра, чтобы сообщить, кто его представил, когда он будет готов.

MyModalViewController.h:

@protocol MyModalViewControllerDelegate; 

@interface MyModalViewController : UIViewController 
{ 
    id<MyModalViewControllerDelegate> delegate; 
} 

@property (nonatomic, assign) id<MyModalViewControllerDelegate> delegate; 

@end 


@protocol MyModalViewControllerDelegate 
- (void)myModalViewControllerFinished:(MyModalViewController*)myModalViewController; 
@end 

MyModalViewController.m:

@synthesize delegate; 

// Call this method when the modal view is finished 
- (void)dismissSelf 
{ 
    [delegate myModalViewControllerFinished:self]; 
} 

ParentViewController.h:

#import "MyModalViewController.h" 

@interface ParentViewController : UIViewController <MyModalViewControllerDelegate> 
{ 
} 

ParentViewController.m:

- (void)presentMyModalViewController 
{ 
    MyModalViewController* myModalViewController = [[MyModalViewController alloc] initWithNibName:@"MyModalView" bundle:nil]; 
    myModalViewController.delegate = self; 
    [self presentModalViewController:myModalViewController animated:YES]; 
    [myModalViewController release]; 
} 

- (void)myModalViewControllerFinished:(MyModalViewController*)myModalViewController 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

EDIT:

Я не использовал UIImagePickerController, но, глядя на документы, похоже, у вас уже есть большая часть кода делается для вас, так как есть существующий UIImagePickerControllerDelegate класс, который имеет три различных " увольнение "делегатских обратных вызовов (хотя один из них устарел). Поэтому вы должны сделать свой класс ParentViewController (независимо от того, что есть) реализовать шаблон UIImagePickerControllerDelegate, а затем реализовать эти методы. Хотя каждый метод будет делать что-то другое (так как вам нужно обрабатывать, когда пользователь на самом деле выбирает изображение или отменяет его), каждый из них будет делать то же самое в конце: вызовите dismissModalViewControllerAnimated:, чтобы отклонить сборщик.

+0

Могу ли я использовать шаблон делегата с пользовательскими делегатами в UIImagePickerController? – Moshe

0

Вы должны как-то отклонить modalViewController? Либо UIButton, либо по коду:

- (void)dismissModalViewControllerAnimated:(BOOL)animated 

В IBAction (например, делегат) для UIButton или в методе выше, вызовите любой код, который вы хотите.

+0

Вы говорите, чтобы переопределить '- (void) rejectModalViewControllerAnimated: (BOOL) анимированный'? Я не думаю, что это сработает, см. Мое редактирование. – Moshe

0

Я не думаю, что есть специальное уведомление, но вы можете подписаться на него, знать, когда прекращается анимация анимации, ... НО. Вы можете реализовать viewDidAppear: в контроллере вида, который представил модальное представление. Это то, что я делаю, когда я использую (для UIImagePickerController очень похоже) ABPeoplePickerNavigationController.

В обратном вызове от выбора людей, я помню человек, повернутый в селекторе на переменном экземпляр, например:

- (void)callbackFromModalView:(id)dataFromModalView { 
    // remember dataFromModalView as I need it when dismissed 
    self.dataFromModalView = dataFromModalView; 

    // now initiate dismissal 
    [self dismissModalViewControllerAnimated:YES]; 
} 

затем, в контроллере представления, реализовать это:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (self.dataFromModalView) { 
     //...present now view here 

     // don't forget to reset this one 
     self.dataFromModalView = nil; 
    } 
} 

Фактически, вы используете комбинацию из viewWillAppear: и dataFromModalView как "уведомление о снятом модале".

Смежные вопросы