防止用户修改SLComposeViewController中的部分文本

现在,我们的代码被设置为从UITextField的 setInitialText获取Facebook / Twitterpost的文本。

我们想要做的是:添加额外的永久消息或URL到Facebook / Twitter的post。

我们应该怎么做? 这是我们目前的代码:

[slComposeThirdViewController setInitialText:[[self QText]text]]; [self presentViewController:slComposeThirdViewController animated:YES completion:nil]; 

这是一个有点牵扯,所以忍受我在这里… 这只适用于SLServiceTypeTwitter

对于读这个感兴趣的人来说,我已经把一个示例项目放在Github上: https : //github.com/NSPostWhenIdle/Immutable-SLComposeViewController

你要做的第一件事是确保你的视图控制器符合UITextViewDelegate 。 您还需要为UITextView创build一个iVar。 实际上你不会创build一个文本视图,但是你需要一个指针来直接指定给SLComposeViewController里面的文本视图。 当你在这里做一个永久性string的iVar。

 @interface ViewController : UIViewController <UITextViewDelegate> //very important! { UITextView *sharingTextView; NSString *permanentText; } 

然后在viewDidLoad中,你可以设置你想要的永久文本是:

 - (void)viewDidLoad { [super viewDidLoad]; permanentText = @"http://www.stackoverflow.com/"; } 

下面的代码是一个非常基本的IBAction ,为composer php提供一些轻微的调整。 首先,您会注意到setInitialText使用格式化string,将永久文本追加到文本字段内容的末尾,并在其间添加一个空格。

那么重要的一部分! 我已经添加了一个循环presentViewController:的完成处理程序循环通过子视图的子视图的一些子视图,以确定包含共享文本的composer php的UITextView 。 这需要完成,所以你可以设置文本视图的委托为了访问UITextViewDelegate方法shouldChangeTextInRange

 - (IBAction)exampleUsingFacebook:(UIButton *)sender { if([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) { SLComposeViewController *sharingComposer = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; SLComposeViewControllerCompletionHandler __block completionHandler=^(SLComposeViewControllerResult result){ [sharingComposer dismissViewControllerAnimated:YES completion:nil]; }; [sharingComposer setCompletionHandler:completionHandler]; [sharingComposer setInitialText:[NSString stringWithFormat:@"%@ %@",[[self QText]text],permanentText]]; [self presentViewController:sharingComposer animated:YES completion:^{ for (UIView *viewLayer1 in sharingComposer.view.subviews) { for (UIView *viewLayer2 in viewLayer1.subviews) { if ([viewLayer2 isKindOfClass:[UIView class]]) { for (UIView *viewLayer3 in viewLayer2.subviews) { if ([viewLayer3 isKindOfClass:[UITextView class]]) { [(UITextView *)viewLayer3 setDelegate:self]; sharingTextView = (UITextView *)viewLayer3; } } } } } }]; } } 

重要提示:请注意,上述内容适用于完成处理程序。

下面是如何设置shouldChangeTextInRange来比较用户试图编辑的范围与包含您的永久文本的范围的示例。 通过这样做,用户将能够更改他们想要的文本的任何部分…除了包含您的永久文本的部分。 你还会注意到,在这个方法里面,我将textView和文本视图进行了比较,我们把这个指针分配给了作曲者的文本视图。 这样做可以让你在这个控制器中使用其他文本视图,而不需要按照我为composer里面的文本视图configuration的相同规则。

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if (textView == sharingTextView) { NSRange substringRange = [textView.text rangeOfString:permanentText]; if (range.location >= substringRange.location && range.location <= substringRange.location + substringRange.length) { return NO; } } return YES; } 

希望这可以帮助!

你可以推出你自己的composer php,追加你的文字,然后使用SLRequest实际提交给服务。

如何从UITextField中捕获用户input的文本,然后构造一个最终的string来追加你想要的永久消息?

 UITextField *textField; NSString *enteredText = [textField text]; NSString *finalPost = [NSString stringWithFormat:@"%@ Your permanent text/URL", enteredText]; 

现在将“finalPost”string发送到Facebook或Twitter。

如果你想用URL追加文本,只需使用addURL:方法。 它不会在SLComposeViewController视图中显示任何文本。 但是在发布用户鸣叫之后会在最后添加URL。

 SLComposeViewController *slComposeThirdViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; [slComposeThirdViewController setInitialText:@"initial Text"]; [slComposeThirdViewController addURL:[NSURL URLWithString:@"http://stackoverflow.com/"]];