如何从UIActivity View Controller中选择的UIActivity项目中呈现ModalViewController?

时间:2013-03-12 19:03:07

标签: ios6 presentmodalviewcontroller uiactivityviewcontroller

我正在开发一个在detailViewController中显示一些数据的应用程序。我在导航栏中有一个rightBarButton,它提供了一个UIActivityViewController,它充满了我自己的UIActivity子图标项。它们中的大多数工作正常,因为它们只是从详细视图中将一个小方面改变为数据,但我需要其中一个在选择时打开modalViewController。我一直从控制台收到以下警告......

    Warning: Attempt to present <UINavigationController: 0x1fd00590>  
on <UITabBarController: 0x1fde1070> which is already presenting <MPActivityViewController: 0x1fd2f970>

我认为值得注意的是应用程序不会崩溃但模态视图也不会出现。我假设UIActivityViewController本身是一个模态视图,你只能一次显示其中一个,所以任务是弄清楚在ActivityView消失后如何执行我的segue,但那就是我难倒的地方。我欢迎任何帮助,想法或反馈。我已经尝试了谷歌但没有太多运气,我认为因为UIActivityViewController是如此新鲜。

到目前为止,这是我的设置, 我的UIActivity对象将一个委托设置为detailViewController,用于自定义协议,该协议允许detailViewController执行数据更改,然后更新其视图。

对于有问题的活动应该提供modalView控制器我尝试了几种方法都得到了相同的警告。


这些都不起作用!!!


1)只是尝试从我的委托方法

执行segue
- (void) activityDidRequestTransactionEdit
{
    NSLog(@"activityDidRequestTransactionEdit");
    [self performSegueWithIdentifier:@"editTransaction" sender:self];
}

2)尝试在UIActivityViewController上设置一个完成块,并让我的委托方法设置一个bool标志,显示模态视图(self.editor)

[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) {
    NSLog(@"completed dialog - activity: %@ - finished flag: %d", activityType, completed);
    if (completed && self.editor) {
        [self performSegueWithIdentifier:@"editTransaction" sender:self];
    }
}];

3)继承UIActivityViewController本身,给它作为委托的detailView,并用我自己的完成块覆盖它的dismissViewControllerAnimated:方法

- (void) dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
    [super dismissViewControllerAnimated:flag completion:^{
        [self.MPActivityDelegate activityDidRequestTransactionEdit];

    }];
}

工作解决方案


在UIActivity子类中,您需要像这样重写此方法

- (UIViewController *) activityViewController {
    MPEditMyDataViewController *controller = [[MPEditMyDataViewController alloc] init];
    controller.activity = self; // more on this property below
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
    return navController;
}

在你的MPEditMyDataViewController.h中(所选动作应该产生的视图控制器) 你需要一个属性回到活动子类,如此

@property (strong, nonatomic) MPEditMyDataActivity *activity;

在你的MPEditMyDataViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc]
                                     initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
                                     target:self
                                     action:@selector(cancel)];

    self.navigationItem.leftBarButtonItem = cancelButton;
}
// here's how you dismiss the view controller when you are done with it
// after saving the changes to your data or whatever the view controller is supposed to do.
-(void) cancel
{
    NSLog(@"Cancel Button Pushed");
    [self.activity activityDidFinish:YES];
}
@end

1 个答案:

答案 0 :(得分:3)

有更多的文档挖掘并发现了这种方法用于UIActivity子类化

- (UIViewController *) activityViewController

它让我的视图控制器像我想要的那样从这里返回而不是试图从我的detailViewController中删除它。现在要弄清楚当我完成它时如何解雇它!!!!