textview - 开始编辑时将光标放在文本末尾

Posted

技术标签:

【中文标题】textview - 开始编辑时将光标放在文本末尾【英文标题】:textview - put cursor at end of text when start editing 【发布时间】:2013-12-04 20:21:54 【问题描述】:

我正在编辑 UITextView 中的文本。当该字段打开进行编辑时,我需要将光标定位在现有文本的最后一个字符之后。我看到的行为是光标或多或少位于我触摸 UITextView 以开始编辑的点下方——也许在我触摸的单词的末尾。我尝试在 textViewDidBeginEditing:textViewShouldBeginEditing: 中设置 textview.selectedRange ,但这根​​本没有效果。我尝试选择现有文本的范围,例如 1,2,但这也没有做任何事情。看起来 selectedRange 或多或少是一个只读值?

- (void) textViewDidBeginEditing:(UITextView *)textView 
    // Position the insertion cursor at the end of any existing text
    NSRange insertionPoint = NSMakeRange([textView.text length], 0);
    textView.selectedRange = insertionPoint;

如何将光标移到文本末尾?

【问题讨论】:

看看答案就在这里:***.com/questions/10135086/… 感谢 artud2000。对我有用的答案是在 UITextView 和点击处理程序中放置一个 UITapGestureRecognizer 以将文本视图设置为第一响应者。在这种情况下,光标的“自然”位置是在现有文本的末尾。 是的,有时需要编写代码来触发或检测 UIControl 元素通常行为之上的事件。 【参考方案1】:

artud2000 的评论引用的帖子包含一个有效的答案。在这里总结一下,添加:

编辑:原来的答案是不够的。我添加了切换似乎足够的可编辑属性。问题是点击手势仅一次(最多)进入处理程序,随后在 UITextField 上的点击直接开始编辑。如果它不可编辑,则 UITextView 的手势识别器不活动,我放置的那个将起作用。这可能不是一个好的解决方案,但似乎确实有效。

- (void)viewDidLoad 
...
    tapDescription = [[UITapGestureRecognizer alloc] 
        initWithTarget:self action:@selector(tapDescription:)];
    [self.descriptionTextView addGestureRecognizer:tapDescription];
    self.descriptionTextView.editable = NO;  // if not set in storyboard


- (void) tapDescription:(UIGestureRecognizer *)gr 
    self.descriptionTextView.editable = YES;
    [self.descriptionTextView becomeFirstResponder];


- (void) textViewDidEndEditing:(UITextView *)textView 
    //whatever else you need to do
    textView.editable = NO;

光标的默认位置似乎在解决我的问题的任何现有文本之后,但如果您愿意,可以通过设置 selectedRange 来选择 textViewDidBeginEditing: 中的文本——例如:

- (void) textViewDidBeginEditing:(UITextView *)textView 
    // Example: to select the second and third characters when editing starts...
    NSRange insertionPoint = NSMakeRange(1, 2);
    textView.selectedRange = insertionPoint;

【讨论】:

【参考方案2】:

感谢查理普莱斯的回答。我用它来解决我在 UITextView 上的类似问题。这是 Swift 中的答案,以防万一有人需要:

...
    let tapDescription = UITapGestureRecognizer(target: self, action: #selector(MyViewController.tapDescription(_:)))
    self.descriptionTextView.addGestureRecognizer(tapDescription)
    self.descriptionTextView.editable = false
...

    func tapDescription(gr: UIGestureRecognizer) 
        self.descriptionTextView.editable = true
        self.descriptionTextView.becomeFirstResponder()
    

    func textViewDidEndEditing(textView: UITextView) 
        self.descriptionTextView.editable = false
    

【讨论】:

以上是关于textview - 开始编辑时将光标放在文本末尾的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在编辑时将 TextField 的光标移动到文本的末尾?- SwiftUI

在 Objective-C 中加载时将光标移动到预填充 Textview 的开头

Gtk TextView - 将光标放置或移动到文本末尾?

Summernote - 在焦点上,在编辑器末尾插入光标

UITextview 光标移动到行尾

文本编辑器的数据结构