UIActivityViewController未将换行符传递给某些活动

8

我正在使用以下代码设置UIActivityViewController:

NSArray *activityItems = [NSArray arrayWithObjects:[self textMessageToShare], nil];

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
        [activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) {
            if (completed) {
                [self sendFeedbackWithIndexPath:indexPath AndLikeType:100 AndCell:nil];
            }
        }];
[self.navigationController presentViewController:activityViewController
                                                animated:YES
                                              completion:^{
                                                  // ...
                                              }];

问题在于,当我将消息或帖子复制到Facebook、Twitter、电子邮件或Gmail应用程序或默认的消息应用程序时,[self textMessageToShare] 中的换行符被保留。然而,如果我分享到WhatsApp或Viber等其他活动中,所有的换行符都会被删除,整个消息会作为单行发送。
但是,如果我只是通过iOS默认的Notes应用程序分享文本,则在分享到这些应用程序时,新的行字符会被保留。那么Notes应用程序是如何存储新行字符的呢?我使用的是\n作为新行字符。
我甚至无法找到原因。有人能帮忙吗?

尝试了 \n 和 \r 两种方式,结果相同。 - BufferStack
这可能取决于应用程序的共享扩展,以查看它是否允许换行。 - Schemetrical
@Schemetrical,正如我在问题中提到的那样,它允许默认的Notes应用程序的新行通过。 - BufferStack
哦,抱歉我没有看到。尝试手动插入一个换行符,替换掉\n - Schemetrical
@Schemetrical 我尝试用\xA替换\n(如果这是你的意思),但结果相同。不知道这里出了什么问题。 - BufferStack
显示剩余2条评论
5个回答

5

我成功地将其转换为新行字符"<br/>"

_myDataString=  self.textview.text;
_myDataString= [_myDataString  stringByReplacingOccurrencesOfString:@"\n" withString:@"<br/>"];

嘿,这太棒了!它解决了问题。但是现在其他使用\n作为换行符的活动正在打印<br/>。您能否找到一种方法,仅对跟随它的那些活动进行选择性的 br 替换? - BufferStack
1
我尝试使用以下代码=> NSString *strRemove = [textToShare stringByReplacingOccurrencesOfString:@"<br/>" withString:@" \n\n\n"]; 但是在Whatsapp文本框中没有得到新行。 - ramesh bhuja

2
请检查使用UIActivityViewController共享Whatsapp时的新行问题。
#import <UIKit/UIKit.h>

@interface ShareActivity : UIActivityItemProvider

@property (nonatomic, strong) NSString *message;
@property (nonatomic, strong) NSArray *activities;

@end


#import "ShareActivity.h"

@implementation ShareActivity
@synthesize message = _message;
@synthesize activities = _activities;

 - (id) activityViewController:(UIActivityViewController     *)activityViewController itemForActivityType:(NSString *)activityType
{
if([activityType    isEqualToString:@"net.whatsapp.WhatsApp.ShareExtension"])
{
return [self.message stringByReplacingOccurrencesOfString:@"\n" withString:@"<br/>"];
}
else if ([self.activities containsObject:activityType]) 
{
return [self.message stringByReplacingOccurrencesOfString:@"\n" withString:@"<br/>"];
}
else 
{
    return self.message;
}
return nil;
}

- (id) activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController 
{ 
return @"";
}

在视图控制器类中,通过任何操作按钮弹出共享视图。将此操作应用于任何按钮操作。

-(void)shareAction
{
ShareActivity *shareObj = [[ShareActivity alloc] initWithPlaceholderItem:@""];

NSString *message = @"New\nLine\nText\nMessage";
[shareObj setMessage:message];

NSArray* dataToShare = @[shareObj];
NSArray *excludeActivities = @[UIActivityTypePrint,UIActivityTypeOpenInIBooks,UIActivityTypeAddToReadingList,UIActivityTypePostToTencentWeibo,UIActivityTypeSaveToCameraRoll,UIActivityTypeAirDrop];

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:dataToShare applicationActivities:nil];
activityVC.excludedActivityTypes = excludeActivities;
[activityVC setCompletionHandler:^(NSString *act, BOOL done)
{

NSString *ServiceMsg = nil;
if ( [act isEqualToString:UIActivityTypeMail] )
{
ServiceMsg = @"Mail sent!";
}
else if ( [act isEqualToString:UIActivityTypePostToTwitter] )
{
ServiceMsg = @"Post on twitter, ok!";
}
else if ( [act isEqualToString:UIActivityTypePostToFacebook] )
{
ServiceMsg = @"Post on facebook, ok!";
}
else if ( [act isEqualToString:UIActivityTypeCopyToPasteboard] )
{
ServiceMsg = @"Message copy to pasteboard";
}
else if ( [act isEqualToString:UIActivityTypePostToFlickr] )
{
ServiceMsg = @"Message sent to flickr";
}
else if ( [act isEqualToString:UIActivityTypePostToVimeo] )
{
ServiceMsg = @"Message sent to Vimeo";
}
else
{

}

}];
[self presentViewController:activityVC animated:YES completion:nil];

}

这与被接受的答案有何不同?同时尽可能精确地回答问题。 - UditS
如果我们添加接受答案行,则Whatsapp活动问题将得到解决,但是在其他活动中添加br /字符,例如Facebook,iMessage,笔记等。 - Rajni Arora
1
这是更好的答案,因为它考虑了不同的共享端点。 - AlexVogel

0

请注意,仅链接答案不被鼓励,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,这些站点随着时间的推移变得陈旧)。请考虑在此添加独立的摘要,并将链接作为参考。 - kleopatra

0

嗨,我又来了,我一直在寻找正确的答案。

我发现你可以通过使用自定义共享消息到不同的提供商来实现它。

你可以从这个代码中找到一个例子,检查MyActivityItemProvider类。

https://github.com/apascual/flip-your-phone

我在这里发布代码时遇到了问题,所以我认为上面的链接会有帮助。


仅提供链接的答案是不被鼓励的,因为链接可能会失效。您能否将相关部分放在此处的正文中? - beresfordt

0

您可以将文本作为多个项目发送,每个项目只有一行。

let lines = text.components(separatedBy: "\n")
let activityViewController = UIActivityViewController(activityItems: lines, applicationActivities: nil)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接