2013-08-09 7 views
16

Wie verhindere ich die Bearbeitung von Text in einem UITextField zusammen mit dem Ausblenden des Cursors/Caret/Lupe, aber immer noch die Tastatur, als Ich verwende eine inputView mit einer UIPickerView/UIDatePickerView?Bearbeiten von Text in UITextField verhindern und Cursor/Caret/Lupe bei Verwendung einer Eingabeansicht ausblenden

Einstellung userInteractionEnabled zu NO funktioniert nicht, da es keine Berührungen mehr erhält und die Tastatur nicht anzeigt.

Antwort

17

Subclass UITextField

//Disables caret 
- (CGRect)caretRectForPosition:(UITextPosition *)position 
{ 
    return CGRectZero; 
} 

//Disables magnifying glass 
-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) 
    { 
     gestureRecognizer.enabled = NO; 
    } 
    [super addGestureRecognizer:gestureRecognizer]; 
} 

In Ihrem UITextFieldDelegate

//Prevent text from being copied and pasted or edited with bluetooth keyboard. 
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    return NO; 
} 

Nun setzen Sie einfach Ihren Text programmatisch aus dem Ergebnis Ihrer UIPickerView/UIDatePicker.

+0

funktioniert nicht unter iOS6 Simulator – raistlin

+0

Es gibt keine Gestenerkenner (iOS 8): (lldb) po [textField gesticRecognizers] -> null –

5

Ich hoffe, dass dies für Sie hilfreich ist.

Setzen Sie den Cursor UIColor -> Empty. In der Benutzeroberfläche wird es ausgeblendet.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor clearColor] forKey:@"insertionPointColor"]; 
+0

ist dies ein offizieller Weg dazu? Ich denke, das ist eine Manipulation der privaten API von Apple. –

+0

Ich dono, das ist offizielle Art und Weise. Aber das ist einer der Wege, um die Aufgabe zu archivieren. –

+0

Das sieht mir verdächtig! Benutze Walapus Antwort. –

15

Ausblenden die Cursor viel einfacher in iOS ist 7. noch einige Tricks brauchen die Lupe

textField.tintColor = [UIColor clearColor]; 
+0

Immer noch nicht wissen, warum Einstellung TintColor aus Storyboard nicht wirksam wird, obwohl der Code tut. – samthui7

0

zu deaktivieren, um eine Interaktion mit Textfeld zu deaktivieren, außer für sie ein erstes Responder machen kann man nur Platz eine UIB-Taste gleicher Größe direkt über dem Textfeld. Code für Schaltfläche Antippereignis könnte so etwas wie dieses:

- (IBAction)btnEditPhoneTapped:(id)sender 
{ 
    if (self.tfClientPhoneNo.isFirstResponder == NO) [self.tfClientPhoneNo becomeFirstResponder]; 
} 
2

ich die beste Lösung

- (CGRect) caretRectForPosition:(UITextPosition*) position 
{ 
    return CGRectZero; 
} 

- (NSArray *)selectionRectsForRange:(UITextRange *)range 
{ 
    return nil; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:)) 
    { 
     returnNO; 
    } 

    return [super canPerformAction:action withSender:sender]; 
} 

http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/

+0

Das funktioniert, aber Sie können immer noch auf das Textfeld klicken und es eingeben, es sei denn, Sie implementieren auch ** textField: sentChangeCharactersInRange: replacementString: ** gemäß der Antwort von Walapu. –

1

Um eine UITextField ohne Interaktion zu haben, aber immer noch arbeiten mit einem inputView war gefunden:

Unterklasse UITextField mit diesen Methoden:

// Hide the cursor 
- (CGRect)caretRectForPosition:(UITextPosition*)position 
{ 
    return CGRectZero; 
} 

// All touches inside will be ignored 
// and intercepted by the superview 
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    return NO; 
} 

Die letzte Methode wird verhindert, dass einhändig jede Bearbeitung und das Lupenglas, da Sie nicht in der Lage, die UITextField zu erschließen.

Dies funktioniert gut, wenn Sie ein Textfeld in einer UITableViewCell zum Beispiel verwenden und dann FirstResponder-Status durch tableView:didSelectRowAtIndexPath: wechseln können.