2015-02-09 13 views
7

Ich habe eine UITextField für die ich UIPickerView als inputView verwenden. Der Benutzer kann einen Wert aus der Auswahl auswählen, und der ausgewählte Wert wird in meine TextInput eingetragen.
Diese Anordnung funktioniert gut, aber mit den folgenden Problemen:Deaktivieren Sie den Cursor und kopieren/Einfügen in UITextView (swift)

1) Ich möchte den Cursor deaktivieren, der immer noch in der UITextField angezeigt wird.
Ich habe versucht, die UITextField deaktivieren, aber dann reagiert es nicht auf Berührungen und dann die UIPickerView zeigt nicht - was es unbrauchbar macht.
2) Da der Picker angezeigt wird und die Tastatur nicht gedrückt wird, wenn der Benutzer auf das Textfeld klickt, kann der Benutzer nichts eingeben, kann aber Text einfügen, der durch langes Drücken kopiert wurde. Wie kann ich das deaktivieren?

Ich kann die relevanten Informationen online nicht finden. Sollte ich dafür eine Label oder eine Button anstelle der UITextInput verwenden?

Antwort

6

Ich denke, die einfache Möglichkeit, es mit einem Knopf statt UITextField

Leider zu machen - für Swift es ist für Obj-C das ist nicht, aber das ist die Idee:

zu tun, was Sie mit UITextField mögen Sie haben die UITextField Unterklasse und versuchen, diesen Code zu verwenden, um zu deaktivieren/auszublenden caret und Eingang (copy/paste)

- (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]; 
} 

Beispiel von hier:Wie dem auch sei

... dies ist ein „funktionelles“ Beispiel: https://github.com/hackiftekhar/IQDropDownTextField

+0

Dies ist eine großartige Lösung für alle, die versuchen, das dataDetectorTypes-Feature im Takt zu halten, ohne dem Benutzer zu erlauben, den Rest des Textes um die verwertbaren Daten auszuwählen (d. H. Kopieren, alle auswählen, nachsehen). Dank @TonyMkenu –

0

Der UITextField Delegierte kann die textFieldShouldBeginEditing Methode implementieren. Wenn diese Methode immer NO zurückgibt, wird der Cursor nie angezeigt und das lange Drücken wird nicht erlaubt.

Wenn die Methode aufgerufen wird, können Sie die UIPickerView anzeigen. Der UIPickerView kann jedoch kein inputView sein. Es müsste das Kind eines Standards UIView sein, den Sie von unten animieren. Oder Sie können einfach die hidden Eigenschaft der UIView verwenden, um die Ansicht nach Bedarf zu verbergen/anzuzeigen.

+0

ich sehe, so dass mein Ansatz 'UIPickerView' als' inputView' für den 'UITextView' falsch zu verwenden ist. Kannst du mich auf ein Beispiel oder etwas ähnliches hinweisen, um es richtig zu machen? – rgamber

+0

Ja, das wird problematisch, weil ich immer noch Objective-C benutze, und ich vermeide Auto-Layout wann immer möglich, damit ich mit Konzepten helfen kann, aber nicht so sehr mit dem Code. – user3386109

7

Wie TonyMkenu sagte, Sie müssen UITextField Unterklasse und implementieren Sie dann die Methoden, die er oben hat. Hier ist der Swift für diejenigen, die nicht wissen, Objective C:

override func caretRectForPosition(position: UITextPosition!) -> CGRect { 
    return CGRect.zeroRect 
} 

override func selectionRectsForRange(range: UITextRange) -> [AnyObject] { 
    return [] 
} 

override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool { 
    // Disable copy, select all, paste 
    if action == Selector("copy:") || action == Selector("selectAll:") || action == Selector("paste:") { 
     return false 
    } 
    // Default 
    return super.canPerformAction(action, withSender: sender) 
} 
1

total albern Hack, aber wenn Sie das Textfeld einer Tönungsfarbe im UIView Abschnitt des Interface Builder Eigenschafteninspektor stellen Sie die Hintergrundfarbe entsprechen , wird der Cursor erscheint unsichtbar:

Verwandte Themen