我想让用户能够点击“操作”按钮,然后弹出通常的共享表,其中应包括“消息”,“Facebook”等图标右侧的其他应用程序 - 可以使用.txt文件的应用程序,或只是NSString
。
我目前正在通过UIActivityViewController
显示共享表格,该表格效果很好,但不包含列表中的其他应用程序。通过阅读其他SO问题,我得出结论,如果您使用UIDocumentInteractionController
,则只能显示其他应用。我研究了在临时目录中创建一个.txt文件来共享该文件(而不是仅仅共享一个NSString
),但是当我点击“共享”按钮时,只显示“邮件(无复制)”。 [请注意,如果我在真实设备上运行它而不是模拟器,那么除了Mail之外的其他应用程序也会出现,AirDrop也会出现。]当我点击Mail时,应用程序崩溃:无法获取URL数据:操作无法完成。 (可可错误260.)我正在创建/检索.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];
结果:
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):
我想要获得的示例 - 减去底部的3个额外选项:
如果由于某种原因我无法使用字符串(而不是照片)获取上述屏幕截图,我愿意实现Dropbox如何完成它。他们在底部添加了一个“打开方式”按钮,其中显示了另一个仅显示其他应用的工作表。请注意,我仍然需要原始工作表上的“复制”选项。
答案 0 :(得分:1)
问题1:为什么我的代码导致崩溃
根据{{3}}文档,可可错误260是NSFileReadNoSuchFileError
。查看代码,我认为文件创建可能失败的唯一方法是self.myUITextField
是nil
。
我建议你先检查一下。如果该属性不是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;
}