如何取消UIActivityItemProvider并且不显示活动?

fed*_*uza 9 nsoperation uiactivity uiactivityviewcontroller

我正在使用UIActivityItemProvider子类来提供自定义数据.但有时获取数据失败,我不想提供活动(例如消息编写器).尝试[self cancel]return nil;item方法中,但消息编写器仍然显示(带有空消息).

Eva*_*yle 5

如果在从 - (id)项返回之前关闭UIActivityViewController,它将不会显示用户选择的活动.

要做到这一点,首先需要在activityViewControllerPlaceholderItem中获取activityViewController.在 - (id)项目中,在dispatch_async中运行代码以更新进度并解除完成/错误,我正在使用promise lib.

在UIActivityItemProvider的子类中,执行类似于以下示例的操作.

-(id) activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{ self.avc = activityViewController;
  return NSURL;
}

-(id)item
{ __block BOOL fileProcDone = NO;
  dispatch_async(dispatch_get_main_queue(), ^
  { self.pvc = [[ProgressAlertVC alloc] init];
    [self.vc presentViewController:self.pvc animated:YES completion:nil];
    [[[[self promiseMakeFile]
    progressed:^(float progress)
    { self.pvc.progress = progress;
    }]
    fulfilled:^(id result)
    { [self.pvc dismissViewControllerAnimated:YES completion:^
      { fileProcDone = YES;
      }];
    }]
    failed:^(NSError *error)
    { [self.pvc dismissViewControllerAnimated:YES completion:^
      { [self.vc dismissViewControllerAnimated:YES completion:^
        { fileProcDone = YES;
        }];
      }];
    }];
  });
  while (!fileProcDone)
  { [NSThread sleepForTimeInterval:0.1];
  }; 
  return NSURL;
}
Run Code Online (Sandbox Code Playgroud)

这将导致来自活动扩展的控制台日志消息,但只要它们正确处理错误,事情应该没问题.如果从 - (id)activityViewController返回nil:itemForActivityType:即使您在此时关闭UIActivityViewController,也不会出现控制台错误,但会获得用户选择的活动.