2012-05-25 101 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); 
} 
相關問題