2012-05-25 100 views
6

我已经找遍了这个整个上午的解决方案,但尚未找到可行的方法。将UITextView光标位置设置为文本结尾

我有一个文本视图,它有一些现有的固定文本,我不希望用户能够修改。在这种情况下,我的每个文本视图都以“1.”,“2”等开头。这个想法是,他们输入的文本将被编号为我以后要做的事情。

我不希望用户能够删除此文本(它本质上是“永久”)。我也不想让他们在这个前期文本的中间添加文本。

为了解决这个问题,我已经做了:

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{ 
    if (range.location < 3) return NO; 

    return YES; 
} 

这个伟大的工程,但如果用户触摸在我的“1”,“2”等任何地方视图的部分,它会将光标设置在那里,这会阻止用户因为范围位置检查而键入文本。在这种情况下,我想要做的是将光标(可能在textViewDidBeginEditing中)设置为视图中文本的末尾。但是,无论我使用的选定范围的组合是多少,我都无法使辅助光标移动到最后。任何帮助将不胜感激。

+0

更简单的方法是将您的数字放在标签中直接对着文本视图,以便它们看起来像是同一句子的一部分。然后,他们只能改变适当的部分。 – lnafziger

回答

4

您可以考虑注册到UIKeyboardWillShowNotification,并在收到通知后,将textview的userInteractionEnabled设置为NO

而且,在某种程度上实现shouldChangeTextInRange方法,如果replacementText等于字符串@""你不改变文本(@""意味着用户被攻退格键)。当用户完成编辑文本并在那里完成时恢复用户交互。

祝你好运!

+0

这似乎是做到这一点的最佳方式。有点愚蠢的设置范围似乎没有工作。 – Jason

10

要将光标移动到结束

textView.selectedRange = NSMakeRange([textView.text length], 0); 

或第三个字符后,将光标移动到

textView.selectedRange = NSMakeRange(3, 0); 

另一个,也许更好,方法可能是清除前三个字符出当用户开始编辑时,在编辑结束后将其添加回来。

+0

这正是我想要做的。不过,无论我设置了selectedRange,光标总是将自己放在视图被触摸的位置。那么,如果用户触摸到文本的位置,它会将光标置于文本的中间位置,否则,如果用户触摸到空白区域,则会将光标放在最后。看起来最后还有一个额外的步骤是覆盖触摸位置的范围。 – Jason

+0

检查我的回答[here](http://stackoverflow.com/questions/8891072/how-to-set-the-position-of-the-cursor-in-uitextview)涉及'performSelector:withObject:afterDelay' 我知道这是迟到,但是......不管 HTH – Cashew

3

我试图做一个货币字段。我不希望用户按下全部字段并可能删除格式化文本。我发现,使光标在最后最简单的方法是做到以下几点中的UITextField

-(void) setSelectedTextRange:(UITextRange *)selectedTextRange{ 

    [super setSelectedTextRange:selectedTextRange]; 
    self.text = self.text; 
} 
0

的子类这种方法隐藏自动更正&键盘不跳。

- (void)rejectAutoCorrectSuggestionInTextView:(UITextView *)textView 
{ 
    if ([textView isFirstResponder]) 
    { 
     NSString *original = textView.text; 
     NSRange originalRange = textView.selectedRange; 
     CGPoint originalOffset = textView.contentOffset; 

     [UIView animateWithDuration:.00001 animations:^{ 
      textView.text = [textView.text stringByAppendingString:@"|"]; 
      NSRange range; 
      range.location = textView.text.length-1; 
      range.length = 0; 
      textView.selectedRange = range; 
      textView.text = [textView.text substringToIndex:textView.text.length - 1]; 
     }]; 

     NSString *final = textView.text; 

     if (![original isEqualToString:final]) 
     { 
      textView.text = original; 
      textView.selectedRange = originalRange; 
      [textView setContentOffset:originalOffset animated:NO]; 
     } 
    } 
} 
6

它已经很晚了,但我在某些博客中发现了这个工作解决方案。它需要一点点破解

- (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); 
} 
相关问题