不要试图直接从 HelpViewController 移动到 UIImagePickerController,你需要通过你的 mainViewController 到达那里。
让我们将您的代码放入一个方法中......
- (void) presentImagePicker {
UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init];
mediaUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
mediaUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
mediaUI.delegate = self;
[controller presentModalViewController: mediaUI animated: YES];
return YES;
}
(请注意,presentModalViewController:animated
自~iOS5 以来已弃用,您应该将其替换为
[controller presentViewController:mediaUI animated:YES completion:nil];
)
让我们称您的viewControllersmainVC
和. 有两种方法可以实现这一点。helpVC
imageVC
方法 1 - performSelector
快速且稍微有点脏的解决方案是在 helpVC 的关闭按钮方法中执行此操作:
- (IBAction)dismissHelpAndPresentImagePicker:(id)sender
{
UIViewController* mainVC = self.presentingViewController;
[mainVC dismissViewControllerAnimated:NO completion:
^{
if ([mainVC respondsToSelector:@selector(presentImagePicker)])
[mainVC performSelector:@selector(presentImagePicker)];
}];
}
它有点脏,因为您需要确保presentImagePicker
实现它mainVC
- 如果不是,编译器不会给您任何警告。此外,在对象被解除后,您正在运行一个完成块,因此不确定它是否会起作用(实际上,确实如此,但仍然......)
请注意,您必须将指针 self.presentingViewController's 分配给局部变量 ( mainVC
)。那是因为当helpVC
被解雇时,它的presentingViewController
属性被重置为零,所以当你运行完成块时,你不能使用它。但是局部变量mainVC
仍然有效。
方法 2 - 协议/委托
干净的方法是使用 helpVC 中的协议来声明委托方法,并使 mainVC 成为委托。这样,编译器将跟踪所有内容并在未正确实现时警告您。
以下是执行此操作的步骤:
在 helpVC.h 中,在 @interface 部分上方添加此协议:
@protocol helpVCDelegate
- (void) dismissHelpAndPresentImagePicker;
@end
在 helpVC.h 接口部分为其委托声明一个属性:
@property (nonatomic, weak) id <helpVCDelegate> delegate;
( <helpVCDelegate>
告诉编译器委托应该符合协议,所以它必须实现dismissHelpAndPresentImagePicker
)
在 helpVC.m 中,您的方法现在可以如下所示:
- (IBAction)dismissHelpAndPresentImagePicker:(id)sender
{
[self.delegate dismissHelpAndPresentImagePicker];
}
在 MainVC 中,当您创建 HelpVC(代码中的 =svc)时,将 MainVC 设置为它的委托:
HelpViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"HelpViewController"];
svc.delegate = self;
[self presentViewController:svc animated:YES completion:nil];
并且一定要实现委托方法dismissHelpAndPresentImagePicker
- (void) dismissHelpAndPresentImagePicker
{
[self dismissViewControllerAnimated:NO completion:^{
[self presentImagePicker];
}];
}
就我个人而言,我总是使用方法 2。但是我今天早些时候为类似的问题提供了一个解决方案,而提问者似乎认为协议/委托过于复杂。也许我的回答看起来如此,我试图在这里简化它。