UIActivityViewController完成处理程序在视图控制器从屏幕上消失之前执行

时间:2013-09-03 09:04:07

标签: ios uiactivityviewcontroller

我正在使用UIActivityViewController来呈现共享选项,并且当用户关闭UIActivityViewController或者当“activityDidFinish:(bool)completed”之后的动画结束时,我想显示另一个视图控制器。当我尝试在UIActivityViewController的完成处理程序中呈现其他控制器时,我收到以下警告,第二个VC根本没有显示!

尝试出现< _UIViewController:0x1e16f020> on< ###>演示文稿正在进行中!

UIActivityViewController activityVC = [[UIActivityViewController alloc]initWithActivityItems:selectedAssetsURL applicationActivities:nil];

[activityVC setCompletionHandler:^(NSString *activityType, BOOL completed) {
    NSLog(@"completed");
    //Present another VC
}];

问题是,如何知道UIActivityViewController何时从屏幕上消失?即使是呈现UIActivityViewController的视图控制器的-ViewDidAppear方法也不会被触发!

1 个答案:

答案 0 :(得分:1)

在此链接中,有关于UIActivityViewController如何工作的良好信息:

http://www.apeth.com/iOSBook/ch26.html#_activity_view

基本上你可以将UIActivityViewController子类化到另一个类中,并实现一个方法来知道它何时被解散。

UIActivityViewController* avc =
[[UIActivityViewController alloc]
    initWithActivityItems:@[myCoolString]
    applicationActivities:@[[MyCoolActivity new]]];

以下是MyCoolActivity实施的准备部分:

-(NSString *)activityType {
return @"com.neuburg.matt.coolActivity"; // make up your own unique string
}

-(NSString *)activityTitle {
    return @"Be Cool";
}

-(UIImage *)activityImage {
    return self.image; // prepared beforehand
}

-(BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
    for (id obj in activityItems) {
        if ([obj isKindOfClass: [NSString class]])
            return YES;
    }
    return NO;
}

-(void)prepareWithActivityItems:(NSArray *)activityItems {
    self.items = activityItems;
}

要执行活动,我们实施以下两种方法之一:

-(void)performActivity {
// ... do something with self.items here ...
[self activityDidFinish:YES];
}

-(UIViewController *)activityViewController {
    MustacheViewController* mvc = [MustacheViewController new];
    mvc.activity = self;
    mvc.items = self.items;
    return mvc;
}

然后MustacheViewController会有这样的代码:

- (IBAction)doCancel:(id)sender {
    [self.activity activityDidFinish:NO];

}
- (IBAction)doDone:(id)sender {
    [self.activity activityDidFinish:YES];

}