我在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;
}
如何将光标移到文本末尾?
答案 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
}