1

我有以下代码来加载工作正常的 UIImagePickerController。

    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;

我想加载一个模态视图,其中包含有关如何使用 UIImagePickerController 的一些帮助信息:

UIStoryboard *storyboard = self.storyboard;
HelpViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"HelpViewController"];
[self presentViewController:svc animated:YES completion:nil];

用户关闭 HelpViewController 视图后如何显示 UIImagePickerController?

4

1 回答 1

3

不要试图直接从 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和. 有两种方法可以实现这一点。helpVCimageVC

方法 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。但是我今天早些时候为类似的问题提供了一个解决方案,而提问者似乎认为协议/委托过于复杂。也许我的回答看起来如此,我试图在这里简化它。

于 2013-02-18T02:35:56.727 回答