如何实现Open In应用程序的纯文本

时间:2014-04-26 02:49:51

标签: ios objective-c uibarbuttonitem uiactivityviewcontroller uidocumentinteraction

我想让用户能够点击“操作”按钮,然后弹出通常的共享表,其中应包括“消息”,“Facebook”等图标右侧的其他应用程序 - 可以使用.txt文件的应用程序,或只是NSString

我目前正在通过UIActivityViewController显示共享表格,该表格效果很好,但不包含列表中的其他应用程序。通过阅读其他SO问题,我得出结论,如果您使用UIDocumentInteractionController,则只能显示其他应用。我研究了在临时目录中创建一个.txt文件来共享该文件(而不是仅仅共享一个NSString),但是当我点击“共享”按钮时,只显示“邮件(无复制)”。 [请注意,如果我在真实设备上运行它而不是模拟器,那么除了Mail之外的其他应用程序也会出现,AirDrop也会出现。]当我点击Mail时,应用程序崩溃:无法获取URL数据:操作无法完成。 (可可错误260.)我正在创建/检索.txt文件的方式有问题。

我的问题是:

  • 为什么我的代码在尝试共享.txt文件时导致崩溃?
  • 如何让“复制”选项显示在与包含其他应用程序的共享表相同的共享表中?

总结一下:我需要一个包含以下内容的共享表:Copy,AirDrop,Messages,Mail,Facebook,Twitter,Pages,Dropbox等,用于简单的文本字符串。谢谢!

以下代码行位于我的IBAction共享按钮点击功能中:
UIActivityViewController方法:

UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:@[self.myUITextField.text] applicationActivities:nil];
[self presentViewController:activityView animated:YES completion:nil];

结果:
enter image description here

UIDocumentInteractionController方法:

NSString *fileName = [NSString stringWithFormat:@"%@mytextfile.txt", NSTemporaryDirectory()];
[self.myUITextField.text writeToFile:fileName
                          atomically:NO
                            encoding:NSStringEncodingConversionAllowLossy
                               error:nil];
NSURL *textFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"mytextfile.txt"]];

UIDocumentInteractionController *documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:textFileURL];
[documentInteractionController presentOptionsMenuFromBarButtonItem:sender animated:YES];

结果(如果我在真实设备上运行,将显示更多应用和AirDrop):

enter image description here

我想要获得的示例 - 减去底部的3个额外选项:

enter image description here

如果由于某种原因我无法使用字符串(而不是照片)获取上述屏幕截图,我愿意实现Dropbox如何完成它。他们在底部添加了一个“打开方式”按钮,其中显示了另一个仅显示其他应用的工作表。请注意,我仍然需要原始工作表上的“复制”选项。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

问题1:为什么我的代码导致崩溃

根据{{​​3}}文档,

可可错误260是NSFileReadNoSuchFileError。查看代码,我认为文件创建可能失败的唯一方法是self.myUITextFieldnil

我建议你先检查一下。如果该属性不是nil,请检查writeToFile:atomically:encoding:error:是否返回错误。


问题2:如何显示“复制”选项

首先,将一个委托分配给控制器:

documentInteractionController.delegate = self;

然后实现以下两个委托方法:

- (BOOL) documentInteractionController:(UIDocumentInteractionController*)controller canPerformAction:(SEL)action
{
  if (@selector(copy:) == action)
    return YES;
  else
    return NO;
}

- (BOOL) documentInteractionController:(UIDocumentInteractionController*)controller performAction:(SEL)action
{
  if (@selector(copy:) != action)
    return NO;
  // Perform the copy: action
  return YES;
}

自iOS 6以来,这两种方法都被标记为已弃用,但它们似乎仍然适用于iOS 7.不幸的是,我不知道如何在没有这两种方法的情况下实施copy:操作 - Apple也不会这样做在我看来,因为他们没有提供替代品,官方的Foundation Constants Reference文件仍然很乐意提到这些方法而没有表明它们已被弃用。

无论如何,这是第二个委托方法的简单但完整的实现:

- (BOOL) documentInteractionController:(UIDocumentInteractionController*)controller performAction:(SEL)action
{
  if (@selector(copy:) != action)
    return NO;

  NSStringEncoding usedEncoding;
  NSError* error;
  NSString* fileContent = [NSString stringWithContentsOfURL:controller.URL
                                               usedEncoding:&usedEncoding
                                                      error:&error];
  UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
  [pasteboard setString:fileContent];
  return YES;
}