我整个上午都在寻找解决方案,但尚未找到有效的方法.
我有一个文本视图,其中包含一些我不希望用户能够修改的现有固定文本.在这种情况下,我的每个文本视图都以"1","2"等开头.这个想法是他们输入的文本将被编号为我稍后要做的事情.
我不希望用户能够删除此文本(它本质上是"永久的").我也不想让他们在这个前文本的中间开始添加文本.
为了解决这个问题,我做了:
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if (range.location < 3) return NO;
return YES;
}
Run Code Online (Sandbox Code Playgroud)
这很好用,除非用户触摸视图中"1.","2"等部分的任何地方,它会将光标设置在那里,这会阻止用户因为范围位置而输入文本校验.在这种情况下我想要做的是将光标(可能在textViewDidBeginEditing中)设置为视图中文本的末尾.但是,无论我使用的selectedRange是什么组合,我都无法让darn游标移动到最后.任何帮助将不胜感激.
tra*_*per 11
将光标移动到最后
textView.selectedRange = NSMakeRange([textView.text length], 0);
Run Code Online (Sandbox Code Playgroud)
或者将光标移动到第三个字符之后
textView.selectedRange = NSMakeRange(3, 0);
Run Code Online (Sandbox Code Playgroud)
另一种可能更好的方法可能是在用户开始编辑时清除前三个字符,然后在编辑完成后将其添加回来.
现在已经很晚了,但我在一些博客中找到了解决方案.它需要一点点破解
- (void) textViewDidBeginEditing:(UITextView*)textview
{
[self performSelector:@selector(placeCursorAtEnd:) withObject:textview afterDelay:0.01];
}
- (void)placeCursorAtEnd:(UITextView *)textview
{
NSUInteger length = textview.text.length;
textview.selectedRange = NSMakeRange(length, 0);
}
Run Code Online (Sandbox Code Playgroud)
您可以考虑注册UIKeyboardWillShowNotification并在收到通知后,将textview设置userInteractionEnabled为NO.
此外,实现该shouldChangeTextInRange方法的方式是,如果replacementText等于字符串@"",则不更改文本(@""意味着用户正在点击退格键).用户完成编辑文本后即可恢复用户交互.
祝好运!
| 归档时间: |
|
| 查看次数: |
18187 次 |
| 最近记录: |