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

时间:2012-11-20 16:46:59

标签: ios facebook twitter social-framework slcomposeviewcontroller

目前,我们的代码设置为从 UITextField 中获取文本作为 setInitialText 获取Facebook / Twitter帖子。

我们想要做的是:在Facebook / Twitter帖子中添加额外的永久消息或URL。

我们怎么做?这是我们当前的代码:

[slComposeThirdViewController setInitialText:[[self QText]text]];

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

4 个答案:

答案 0 :(得分:3)

这有点牵扯,所以请耐心等待...... 这只适用于SLServiceTypeTwitter

对于有兴趣使用此功能的读者,我在Github上放了一个示例项目:https://github.com/NSPostWhenIdle/Immutable-SLComposeViewController

首先要确保视图控制器符合UITextViewDelegate。您还需要为UITextView创建iVar。您实际上不会创建文本视图,但是您需要一个指针直接指向SLComposeViewController内的文本视图。当你在这里为永久字符串制作一个iVar时。

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

然后在viewDidLoad中,您可以设置您希望永久文本的内容:

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

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

然后是重要的部分!我已经为presentViewController:的完成处理程序添加了一个循环,以循环浏览子视图的子视图的一些子视图,以便识别包含共享文本的作曲家中的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与shareingTextView进行了比较,这是我们分配给作曲家内部文本视图的指针。这样做将允许您在此控制器中使用其他文本视图,而不会遵循我为作曲家内部的文本视图配置的相同规则。

- (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;
}

希望这有帮助!

答案 1 :(得分:2)

您可以滚动自己的作曲家,附加文字,然后使用SLRequest将其实际提交给服务。

答案 2 :(得分:1)

如何从UITextField捕获用户输入的文本,然后构建一个最终字符串,从中附加您想要的永久消息?

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

现在将“finalPost”字符串发布到Facebook或Twitter。

答案 3 :(得分:0)

如果要使用URL附加文本,只需使用addURL:方法即可。它不会在SLComposeViewController的视图中显示任何文本。但是在发布用户推文后会在最后添加URL。

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