代码之家  ›  专栏  ›  技术社区  ›  R. Mohan fethica

UIActivityViewController在iOS 11中不工作

  •  15
  • R. Mohan fethica  · 技术社区  · 7 年前

    我正在使用UIActivityViewController共享文章url,使用以下代码,

    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];
    
    activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop]; 
    
    [self presentViewController:activityVC animated:YES completion:nil];
    

    编辑:在清理并运行项目后,我尝试了同样的操作,在UIActivityViewController被打开2到3次后,我再次尝试,第一次我得到相同的上述错误,第二次只有UIActivityViewController被打开。

    4 回复  |  直到 7 年前
        1
  •  8
  •   Alejandro Iván    7 年前

    根据设计,所有修改用户界面的代码都需要在主队列中运行。所以你需要做的就是:

    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];
    
    activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop]; 
    
    dispatch_async(dispatch_get_main_queue(), ^{
        [self presentViewController:activityVC animated:YES completion:nil];
    });
    

    dispatch_async() 将把您传递给它的块排队,以便在不久的将来安全地更新UI时运行。如果在主队列上不这样做,可能会发生奇怪的事情(有时用户界面根本不会更改,或者旧的更改可以在新的更改之后应用,或者诸如此类的事情)。

    从UI中的用户操作(例如,在 IBAction 当你点击一个按钮)已经在主队列上运行,所以 dispatch\u async() 没有必要(当然,假设你没有打电话给他们 IBAction公司 从另一个队列手动)。

    请注意 alloc / init setExcludedActivityTypes: 不要更新用户界面,因此不需要在主队列中调用它们。

        2
  •  8
  •   vp2698    7 年前

    对于swift 4.0

    let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [shareItem], applicationActivities:nil)
    activityViewController.excludedActivityTypes = [.print, .copyToPasteboard, .assignToContact, .saveToCameraRoll, .airDrop]
    
    DispatchQueue.main.async {
       self.present(activityViewController, animated: true, completion: nil);
    }
    
        3
  •  1
  •   Shaunak Shukla    7 年前

    试试这个:

        dispatch_async(dispatch_get_main_queue(), ^{
             UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];
    
             activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop]; 
             dispatch_async(dispatch_get_main_queue(), ^{
                   [self presentViewController:activityVC animated:YES completion:nil];
             });
        });
    

    我也有同样的问题,但在Swift3中,效果很好。

        4
  •  0
  •   Raphael Augusto da Silva    7 年前

    我遇到了同样的问题,我发现我没有调用UI线程。尝试在UI线程中运行,看看是否解决了问题