2012-05-25 18 views
6

Ich habe den ganzen Morgen nach einer Lösung gesucht, aber muss noch etwas finden, das funktioniert.Einstellung UITextView Cursor-Position bis zum Ende des Textes

Ich habe eine Textansicht, die einen festen Text enthält, den der Benutzer nicht ändern darf. In diesem Fall beginnt jede meiner Textansichten mit "1.", "2." usw. Die Idee ist, dass der eingegebene Text für etwas nummeriert wird, was ich später mache.

Ich möchte nicht, dass der Benutzer diesen Text löschen kann (es ist im Wesentlichen "permanent"). Ich möchte ihnen auch nicht erlauben, in der Mitte dieses Vortexts Text hinzuzufügen.

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

    return YES; 
} 

Dies funktioniert gut, außer dass, wenn der Benutzer berührt überall in meinem „1“, „2“, usw. Teile der Ansicht es,:

Um dies zu umgehen, habe ich getan wird den Cursor dort setzen, was den Benutzer daran hindert, aufgrund der Überprüfung des Bereichsstandorts Text einzugeben. Was ich in diesem Fall tun möchte, ist den Cursor (vielleicht in textViewDidBeginEditing) an das Ende des Textes in der Ansicht gesetzt. Unabhängig davon, welche Kombination von selectedRange ich verwende, kann ich den verdorbenen Cursor jedoch nicht zum Ende bewegen. Jede Hilfe würde sehr geschätzt werden.

+0

Ein noch einfacherer Weg wäre, Ihre Zahlen in ein Label direkt gegen Ihre Textansicht zu setzen, so dass sie aussehen wie sie Teil des gleichen Satzes sind. Dann können sie nur den entsprechenden Teil ändern. – lnafziger

Antwort

4

Sie in Erwägung ziehen könnte, um die UIKeyboardWillShowNotification Registrierung und nach Erhalt der Benachrichtigung, stellen die userInteractionEnabled-NO der Textview.

Auch die shouldChangeTextInRange Verfahren in einer Weise umzusetzen, dass, wenn replacementText auf den String gleich @"" Sie nicht den Text ändern (was bedeutet, @"" der Benutzer Backspace tippt). Stellt die Benutzerinteraktion wieder her, wenn der Benutzer die Bearbeitung des Textes abgeschlossen hat und los geht's.

Viel Glück!

+0

Dies scheint der beste Weg gewesen zu sein, dies zu tun. Art von dumm, dass Einstellungsbereich scheint nicht zu funktionieren. – Jason

10

Um den Cursor an das

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

oder den Cursor auf nach dem dritten Zeichen

textView.selectedRange = NSMakeRange(3, 0); 

Ein weiterer, vielleicht besser zu bewegen, Ansatz, um die ersten drei Zeichen aus löschen könnte sein, Wenn der Benutzer mit der Bearbeitung beginnt, fügen Sie sie nach der Bearbeitung wieder hinzu.

+0

Genau das habe ich versucht. Es scheint jedoch, dass der Cursor immer, wenn ich selectedRange gesetzt habe, sich selbst dort platziert, wo die Ansicht berührt wurde. Nun, es wird den Cursor irgendwo in der Mitte des Textes platzieren, wenn der Benutzer berührt, wo Text ist, andernfalls wird der Cursor an das Ende gesetzt, wenn der Benutzer in einem leeren Bereich berührt. Es scheint, als gäbe es am Ende einen zusätzlichen Schritt, der den Bereich mit Touch-Position überschreibt. – Jason

+0

Überprüfen Sie meine Antwort [hier] (http://stackoverflow.com/questions/8891072/how-to-set-the-position-of-the-cursor-in-uitextview) mit 'performSelector: withObject: afterDelay' Ich weiß, das ist spät, aber ... was auch immer HTH – Cashew

3

Ich habe versucht, ein Währungsfeld zu machen. Ich wollte nicht, dass der Benutzer das ganze Feld drückt und möglicherweise formatierten Text löscht. Der einfachste Weg, ich am Ende den Cursor halten zu finden ist die folgende in einer Unterklasse von UITextField

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

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

Diese Methode hide Selbstkorrektur & Tastatur nicht springen zu tun.

- (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

Es ist spät, aber ich fand funktionierende Lösung für diese in einem Blog. Es braucht einen kleinen Hack

Verwandte Themen