【问题标题】:UIActivityViewControllerCompletionHandler How to?UIActivityViewController 完成处理程序如何?
【发布时间】:2012-09-15 04:01:59
【问题描述】:

我正在尝试使用 UIActivityViewControllerCompletionHandler,但我不太明白如何..

我想检测用户何时完成或关闭此视图控制器 (UIActivityViewController)。

有人知道怎么做吗?

【问题讨论】:

    标签: objective-c event-handling cocos2d-iphone ios6


    【解决方案1】:

    这是显示共享对话框并设置其完成处理程序的方法

    NSArray *imageArray = [NSArray arrayWithObject:shareImage];
    
    UIActivityViewController *sharing = [[UIActivityViewController alloc] initWithActivityItems:imageArray applicationActivities:nil];
    
    [sharing setCompletionHandler:^(NSString *activityType, BOOL completed) {
        NSLog(@"completed dialog - activity: %@ - finished flag: %d", activityType, completed);
    }];
    
    [self presentViewController:sharing animated:YES completion:nil];
    

    【讨论】:

    • 老兄,我怎么知道我发帖成功了?因为即使帖子确实失败了,“已完成”仍然是 Yes/1
    • 此方法在 iOS8 中已弃用。
    【解决方案2】:

    在 iOS 8 中,completionHandler已弃用,因此您需要提供替代的 completionWithItemsHandler。它还允许处理您设置的扩展修改数据(例如照片扩展)。见Documentation

        UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[text, URL, image] applicationActivities:nil];
        activityViewController.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeAirDrop, UIActivityTypeAddToReadingList];
    
        // check if new API supported
        if ([activityViewController respondsToSelector:@selector(completionWithItemsHandler)]) {
            activityViewController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
                // When completed flag is YES, user performed specific activity
            };
        } else {
            activityViewController.completionHandler = ^(NSString *activityType, BOOL completed) {
                // When completed flag is YES, user performed specific activity
            };
        }
    

    【讨论】:

      【解决方案3】:
      typedef void (^UIActivityViewControllerCompletionHandler)
          (NSString *activityType, BOOL completed);
      

      完成处理程序的第二个参数告诉您用户是否关闭了控制器。如果他们解除了控制器,completed 将被设置为NO

      the completion handler's documentation有更多详情。

      【讨论】:

      • 嘿哥们,我怎么知道我发帖成功了?因为即使帖子确实失败了,“完成”仍然是 Yes/1 – Paradise
      【解决方案4】:

      斯威夫特 5:

      func showShareOf(url: URL, title: String) {
          let shareItems: [Any] = ["\(title)\n", url]
          let activityVC = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
          activityVC.completionWithItemsHandler = doneSharingHandler
          self.present(activityVC, animated: true, completion: nil)
      }
      
      @objc func doneSharingHandler(activityType: UIActivity.ActivityType?, completed: Bool, _ returnedItems: [Any]?, error: Error?) {
          if (!completed) { return }
          // If here, log which activity occurred
          print("Shared activity: \(activityType)")
      }
      

      【讨论】:

        【解决方案5】:

        对于 Swift,这个对我有用...

        // 配置 UIActivityViewController 让 activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) activityViewController.excludedActivityTypes = [UIActivityTypeAirDrop, UIActivityTypeAddToReadingList, UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeCopyToPasteboard] // 显示 UIActivityViewController presentViewController(activityViewController,动画:真,完成:无) // 定义完成处理程序 activityViewController.completionWithItemsHandler = doneSharingHandler ... func doneSharingHandler(activityType:String!,完成:Bool,returnItems:[AnyObject]!,错误:NSError!){ // 如果取消则返回 如果(!完成){ 返回 } // 如果在这里,记录发生了哪个活动 println("共享视频活动:\(activityType)") }

        【讨论】:

        • 你能添加一个 doneSharingHandler 作为块声明吗?
        猜你喜欢
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 2015-08-30
        相关资源
        最近更新 更多