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

时间:2013-12-04 20:21:55

标签: ios ios7 uitextview

我在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;
}

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

感谢Charlie Price的回答。我用它来解决我在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
    }