【问题标题】:Prevent users from modifying part of the text in SLComposeViewController防止用户修改 SLComposeViewController 中的部分文本
【发布时间】:2012-11-08 19:14:15
【问题描述】:

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

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

我们怎样才能做到这一点?这是我们当前的代码:

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

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

【问题讨论】:

  • 澄清一下,我们想保留 UITextField 中的文本,我们只是想向其中添加额外的永久消息。
  • 我在您的个人资料中看到您没有将问题的任何答案标记为正确。如果您不知道,如果某个答案帮助您解决了问题,您应该点击帖子旁边的“复选标记”将其标记为正确。

标签: ios facebook twitter social-framework slcomposeviewcontroller


【解决方案1】:

这有点牵扯,所以请耐心等待... 这仅适用于 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 进行了比较,这是我们分配给 composer 内部文本视图的指针。这样做将允许您在此控制器中使用其他文本视图,而无需遵循我为 Composer 中的文本视图配置的相同规则。

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

希望这会有所帮助!

【讨论】:

  • 请不要这样做,它很容易被更新破坏...滚动你自己的作曲家并呈现它。
  • 你会如何在 swift 3 中做到这一点?我无法获取 UITextView。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢您的回复。这是我们实现的代码,我们在发布时得到 (null)。谢谢! UITextField *QText;NSString *enteredText = [QText text];NSString *finalPost = [NSString stringWithFormat:@"%@test", enteredText];[slComposeThirdViewController setInitialText:finalPost];
    • 这个想法是在 UITextField 中输入的文本中附加一个固定的文本。因此,固定文本不可编辑/可删除,因此是永久性的。我错过了你的观点吗? finalPost 字符串具有硬编码的固定文本,因此用户不可编辑。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多