【问题标题】:How to set cursor position for UITextView on user input?如何在用户输入上为 UITextView 设置光标位置?
【发布时间】:2012-04-13 04:05:33
【问题描述】:

我正在为这个问题寻找一个简单的答案...

我有一个UITextView,用户可以在其中开始输入并单击完成并退出键盘。

当想要再次编辑它时,我希望光标(闪烁的线)位于textView 的第一个位置,而不是 textView 的末尾。 (充当占位符)

我在textViewDidBeginEditing 上尝试了setSelectedRangeNSMakeRange(0,0),但它不起作用。

更多信息:

可以看出..当用户点击textView时,cursor出现在用户点击textView的位置。

我希望它在textViewDidBeginEditing 时始终在起始位置闪烁。

【问题讨论】:

标签: iphone objective-c xcode cocoa-touch uitextview


【解决方案1】:

属性 selectedRange 不能在“任何地方”分配,要使其工作,您必须实现方法 - (void)textViewDidChangeSelection:(UITextView *)textView,在您的情况下:

- (void)textViewDidChangeSelection:(UITextView *)textView
{
    [textView setSelectedRange:NSMakeRange(0, 0)];
}

您必须检测用户何时开始编辑或选择文本

【讨论】:

  • 这是我遇到的最好的解决方案。这应该是最佳答案!
  • 工作就像一个魅力!谢谢!
  • 传奇!搜索堆栈溢出总是比阅读文档快:)
【解决方案2】:

我的解决方案:

- (void) viewDidLoad {
    UITextView *textView = [[UITextView alloc] initWithFrame: CGRectMake(0, 0, 200, 200)];
    textView.text = @"This is a test";
    [self.view addSubview: textView];
    textView.delegate = self;
    [textView release];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(tapped:)];
    [textView addGestureRecognizer: tap];
    [tap release];
}
- (void) tapped: (UITapGestureRecognizer *) tap {
    [textView becomeFirstResponder];
} 

- (void) textViewDidBeginEditing:(UITextView *)textView {
    textView.selectedRange = NSMakeRange(0, 0);
}

我猜它是 UITextView 内部机制,当用户点击它时设置光标。我们需要通过附加轻击手势识别器来覆盖它并改为调用becomeFirstResponder

【讨论】:

  • 您发布的链接无效-Unknown Paste ID!
  • 您好,帮助我的代码不使用自定义键盘显示输入光标?
【解决方案3】:

我遇到了同样的问题 - 基本上在成为第一响应者时存在延迟,不允许您在任何 textView*BeginEditing: 方法中更改 selectedRange。如果您尝试延迟setSelectedRange:(比如说performSelector:withObject:afterDelay:),它会显示出丑陋的混蛋。

解决方案实际上非常简单 - 检查委托方法的顺序会给您提示:

  1. textViewShouldBeginEditing:
  2. textViewDidBeginEditing:
  3. textViewDidChangeSelection:

在最后一个方法 (3) 中设置 selectedRange 可以解决问题,您只需要确保仅在 UITextView 成为第一响应者时第一次重新定位光标,因为方法 (3) 每次都会被调用更新内容的时间。

shouldChangeTextInRange: 中设置的 BOOL 变量 其中一种方法 (1)、(2) 并检查 (3) 中的变量应该可以解决问题...只是不要忘记在重新定位后重置变量以避免常量光标重置:)。

希望对你有帮助!

编辑

经过几轮测试,我决定在shouldChangeTextInRange: 中设置 BOOL 标志,而不是 (2) 或 (3),因为事实证明它更通用。查看我的代码:

@interface MyClass
{
    /** A flag to determine whether caret should be positioned (YES - don't position caret; NO - move caret to beginning). */
    BOOL _isContentGenerated;
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    // deleting
    if([text length] == 0)
    {
        // deleting last character
        if(range.length == [[textView text] length])
        {
            // reached beginning
            /** 
             code to show placeholder and reset caret to the beginning 
            */
            _isContentGenerated = NO;
        }
    }
    else
    {
        // adding
        if(range.location == 0)
        {
            /** 
             code to hide placeholder
            */
            _isContentGenerated = YES;
        }
    }
    return YES;
}

- (void)textViewDidChangeSelection:(UITextView *)textView
{
    if(!_isContentGenerated)
    {
        [textView setSelectedRange:NSMakeRange(0, 0)];
    }
}

【讨论】:

  • 很好的答案,但可以通过添加代码来改进。
  • @meaning-matters 现在,这就是我所说的圣诞节:D 谢谢!
【解决方案4】:

我在这方面的工作还不足以完全帮助您,但是当您尝试使用不同的selectedRanges 时会发生什么?说,如果你做[... setSelectedRange:[NSMakeRange(0,1)]][... setSelectedRange:[NSMakeRange(1,0)]]?它会将光标移动到任何地方吗?

【讨论】:

  • 嗯。就像我在问题中所说的那样。这没用。光标位置 = 用户点击的位置。
  • 如果它不改变行为,听起来它根本不会打电话给你的setSelectedRange。在调用上设置断点并执行?
  • 它确实调用了它。我担心的是 - 这并不能解决问题。
【解决方案5】:

所以我最终在UITextView 上添加了一个 UILabel,它充当了 textView 的占位符。点击 UILabel 会将操作发送到 textView 和 becomeFirstResponder。开始输入后,将标签隐藏。

【讨论】:

  • 看起来非常老套。为什么不用 UIView 而不是 UILabel?
  • @fatuhoku: '...UITextView 上的 UILabel 作为 textView 的占位符'
【解决方案6】:
[_detailAreaView setTextContainerInset:UIEdgeInsetsMake(8, 11, 8, 11)];

【讨论】:

  • 这与问题无关,这只是说明如何创建一个插图,从而在 textview 中移动文本位置。
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
相关资源
最近更新 更多