gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:42:58 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

对于任何阅读本文并有兴趣使用它的人,我在 Github 上放了一个示例项目:https://github.com/NSPostWhenIdle/Immutable-SLComposeViewController

您要做的第一件事是确保您的 View Controller 符合 UITextViewDelegate .您还需要为 UITextView 创建一个 iVar。 .您实际上不会创建 TextView ,但您需要有一个指针直接分配给 SLComposeViewController 中的 TextView 。 .当您在这里时,也为永久字符串制作一个 iVar。

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

然后在 viewDidLoad 你可以设置你想要的永久文本:
- (void)viewDidLoad
{
[super viewDidLoad];
permanentText = @"http://www.stackoverflow.com/";
}

下面的代码是一个非常基本的 IBAction向 Composer 展示一些细微的调整。首先,您会注意到 setInitialText使用格式化字符串将永久文本附加到文本字段内容的末尾,并在其间添加空格。

然后是重要的部分!我在 presentViewController: 中添加了一个循环的完成处理程序以循环通过 subview 的 subview 的某些 subview ,以识别 UITextView在包含共享文本的 Composer 中。这需要完成,以便您可以设置该 TextView 的委托(delegate)以访问 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 内部 TextView 的指针。这样做将允许您在此 Controller 中使用其他 TextView ,而无需遵循我为 Composer 中的 TextView 配置的相同规则。
- (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;
}

希望这可以帮助!

关于ios - 防止用户修改 SLComposeViewController 中的部分文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13477970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com