2014-07-06 6 views
40

Ich bin eine benutzerdefinierte Tastatur erstellen und ich bin die folgenden Delegate Methoden in meinem InputViewController implementieren.
Aber ich bekomme immer _textInput = nil_Nil-Objekt in iOS8 Delegate Methoden - benutzerdefinierte Tastaturen

- (void)textWillChange:(id<UITextInput>)textInput 
- (void)textDidChange:(id<UITextInput>)textInput 
- (void) selectionWillChange:(id<UITextInput>)textInput 
- (void) selectionDidChange:(id<UITextInput>)textInput 

Weiß jemand, wie man es beheben?
Ist es aus einem Grund nil?
Muss ich etwas selbst implementieren?

+0

Apples API erwähnt nur _ "textInput Die Dokumentinstanz, deren Klasse das UITextInput-Protokoll annimmt." _ Nicht gerade hilfreich. Hat Apple dafür einen Beispielcode? Da ist viel zu viel Nebel. – bauerMusic

+0

Jetzt mit Beta 6, jeder Aufruf von 'textInput' führt zum Absturz der Tastatur. – bauerMusic

+0

@bauerMusic rufst du self.textDocumentProxy an? Welchen Text Input meinst du? – nurxyz

Antwort

2

Gute Frage. Aber es scheint, dass UITextInputDelegate ist kein Protokoll, das Sie implementieren.

von Apple Docs Lower Level Text-Handling Technologies dem Titel:

Wenn Änderungen in der Textansicht auftreten aufgrund externer Gründe, das heißt sie durch Anrufe aus dem Texteingabesystem-the UITextInput Objekt nicht verursacht werden, sollten senden Sie textWillChange:, , selectionWillChange: und selectionDidChange: Nachrichten an den Eingang Delegate (wo es einen Verweis auf). Wenn zum Beispiel Benutzer tippen eine Textansicht und Sie den Bereich des ausgewählten Textes das Einfügemarke unter dem Finger zu platzieren, würden Sie selectionWillChange: senden, bevor Sie den gewählten Bereich zu ändern, und Sie senden selectionDidChange: , nachdem Sie den Bereich ändern .

Und von der docs auf UITextInputDelegate:

Die UIKit bietet einen privaten Texteingabe delegieren, die es bei Laufzeit auf die inputDelegate Eigenschaft des Objekts, dessen Klasse die UITextInput Protokoll nimmt zuweist.

Die Auswirkungen des oben sind, dass wir diese Delegatmethoden nicht implementieren tun; Wir verwenden sie, um die inputDelegate zu informieren, dass Sie Ihren Text oder Ihre Auswahl über andere Mittel als Tastatureingabe geändert haben.

Hier ist eine example Methode, die dies veranschaulicht: here

- (void)delete:(id)sender; 
{ 
    if (selection && ![selection isEmpty]) { 
     [inputDelegate textWillChange:self]; 
     [inputDelegate selectionWillChange:self]; 
     [self replaceRange:selection withText:@""]; 
     [inputDelegate selectionDidChange:self]; 
     [inputDelegate textDidChange:self]; 
    } 
} 

Beispielcode mit mehr Beispielen.