ios - UIActivityViewController 在电子邮件或文本而非 fb 或 Twitter 时卡住

标签 ios uiactivityviewcontroller

我有一个非常标准的 UIActivityViewController 实现。当我使用 Twitter 或 Facebook 时, View Controller 被关闭,应用程序继续工作。但是,当我通过电子邮件或短信发送相同的内容时, View Controller 被关闭但应用程序卡住(不是崩溃)。一切都还在屏幕上但卡住了——没有输入等。

也许邮件或消息应用程序尚未将控制权交还给我的应用程序?有没有办法使用 Instruments 来分析发生了什么?

谢谢!

作为违规者,我从 NSArray 的这部分得到了泄漏

- (void)postToFacebook:(UITapGestureRecognizer *)sender
{
    NSString *postText = @"Testing";
    UIImage *imageToPost = [self captureTheScreenImage];
    NSArray *postItems = @[postText, imageToPost];

    UIActivityViewController *activityPostVC = [[UIActivityViewController alloc]initWithActivityItems:postItems applicationActivities:nil];


    NSArray *excludedItems = @[UIActivityTypePostToWeibo,UIActivityTypePrint,UIActivityTypeCopyToPasteboard,UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll, UIActivityTypeMail, UIActivityTypeMessage];

    [activityPostVC setExcludedActivityTypes:excludedItems];

    [self presentViewController:activityPostVC animated:YES completion:nil];

}

最佳答案

我在同时使用多个 UIWindow 对象时也遇到过这个问题。

关闭 UIActivityViewController 后,显示的窗口内容无法正确恢复。具体来说,窗口的第一个 subview (UILayoutContainerView) 缺少对父 View 的约束。这会导致 UILayoutContainerView 的窗口宽度为零,导致窗口看起来透明并显示其下方的窗口,但不允许用户交互。

修复方法是在当前窗口顶部放置一个空的透明窗口,并从与该新窗口关联的空 View Controller 中呈现 UIActivityViewController。当 UIActivityViewController 被关闭时,我们可以处理显示它的空窗口。

import Foundation

private var previousWindow: UIWindow?
private var activityViewControllerWindow: UIWindow?

extension UIViewController {

  fileprivate var isActivityViewControllerWindowPresented: Bool {
    return activityViewControllerWindow?.isKeyWindow ?? false
  }

  func presentActivityViewController(_ activityViewController: UIActivityViewController, animated: Bool = true, completion: (() -> Void)? = nil) {
    if isActivityViewControllerWindowPresented {
      return
    }

    let window = UIWindow(frame: view.window!.frame)
    previousWindow = UIApplication.shared.keyWindow
    activityViewControllerWindow = window
    window.rootViewController = UIViewController()
    window.makeKeyAndVisible()

    let activityCompletionClosure = activityViewController.completionWithItemsHandler
    activityViewController.completionWithItemsHandler = { [weak self] (activityType, completed, returnedItems, activityError) in
      self?.cleanUpActivityViewControllerWindow()
      activityCompletionClosure?(activityType, completed, returnedItems, activityError)
    }

    window.rootViewController?.present(activityViewController, animated: animated, completion: completion)
  }

  fileprivate func cleanUpActivityViewControllerWindow() {
    previousWindow?.makeKeyAndVisible()
    activityViewControllerWindow?.rootViewController = nil
    activityViewControllerWindow = nil
  }

}

关于ios - UIActivityViewController 在电子邮件或文本而非 fb 或 Twitter 时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16909402/

相关文章:

ios - 调整 UITableViewCell 的 NSLayoutConstraint 错误

iphone - 寻找相当于在 IOS 中查找字符串中字符的先前索引的方法

jquery - 我应该使用 jquery 还是 jquery 移动或 iPad 网页?

ios9 - 无法使用 UIActivityViewController 与 Facebook Messenger 共享文本

iphone - 创建 NSURL 但仅显示链接文本

swift - 在 activityViewController 中更改 barTintColor

ios - phonegap 的 child 浏览器插件也打开 ios 嵌入式 webview 和 child 浏览器

ios - dispatch 组通知安置?

swift - 如何通过短信发送带有数据的应用程序链接

ios - 是否可以直接跳转到 UIActivityViewController 中的共享扩展之一?