2010-09-16 58 views
1

当模态视图完成解除时有没有办法调用代码?UIView通知当模式UIImagePickerController被解雇?

编辑:

对不起,我之前没有澄清。我试图解雇一个UIImagePickerController,然后显示一个MFMailComposeViewController并将图像数据附加到电子邮件中。当我尝试调用

[self presentModalViewController: mailController]

之后

[self dismissModalViewController];

我得到的错误和这样的。

+0

看到我的答案更新。 – 2010-09-17 17:33:34

回答

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]; 
} 

编辑:

我没有用过UIImagePickerController,但在看文档,它看起来像你已经有最适合你做的代码,因为没有一个现有的UIImagePickerControllerDelegate类,有三种不同的“解雇“委托回调(尽管一个已被弃用)。所以你应该让你的ParentViewController类(不管那是什么)实现UIImagePickerControllerDelegate模式,然后实现这些方法。虽然每种方法都会做不同的事情(因为您必须在用户实际选择图片或取消图片时处理),但每种方法最后都会做同样的事情:致电dismissModalViewControllerAnimated:关闭选取器。

+0

我可以在UIImagePickerController上使用委托模式和自定义委托吗? – Moshe 2010-09-17 14:34:41

0

你必须解雇modalViewController莫名其妙?任一个UIButton,或通过代码:

- (void)dismissModalViewControllerAnimated:(BOOL)animated 

在IBAction为(例如代表)用于UIButton的或在上述方法,打电话给你想要的任何代码。

+0

你是说重写' - (void)dismissModalViewControllerAnimated:(BOOL)animated'?我不认为这会奏效,请参阅我的编辑。 – Moshe 2010-09-17 14:35:18

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属性的组合作为“关于已取消模态视图的通知”。