2011-01-12 9 views
8

Mam niestandardową klawiaturę, której używam do edycji tekstu w mytextField i działa świetnie. Nie mogę jednak uzyskać delegata shouldChangeCharactersInRange do wykonania przy użyciu mojej niestandardowej klawiatury. Wykonuje się, gdy używam mojej faktycznej klawiatury (oczywiście nie jest to domyślna klawiatura iPhone'a, ponieważ ustawiłem mytextField.inputView = numberPad.view). Co należy zrobić, aby delegat shouldChangeCharactersInRange mógł strzelać przy użyciu niestandardowej klawiatury? BTW, niestandardowa klawiatura to tylko garść przycisków.Jak uzyskać UITextFieldDelegate.shouldChangeCharactersInRange na uruchamianie za pomocą niestandardowego inputView?

- (void) numberPadPressed: (UIButton *)sender { 
    [mytextField insertText:[[NSNumber numberWithInt:sender.tag] stringValue]]; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string]; 
    NSLog(@"shouldChangeCharactersInRange: %@", resultingString); 
    return true; 
} 

- (void)viewDidLoad { 
    mytextField.text = @""; 
    mytextField.inputView = numberPad.view; 
    mytextField.delegate = self; 
    [mytextField becomeFirstResponder]; 
} 

Odpowiedz

0

Edycja: przepraszam, źle zrozumiałem twoje pytanie wcześniej.

pole tekstowe wywołuje shouldChangeCharactersInRange gdy robi wejście z klawiatury systemowej , dając możliwość sprawdzenia, czy tekst powinien faktycznie wyświetlić (na przykład można wdrożyć go rozpoznać skrót i włożyć trochę dłuższy tekst) ty. Ale pole tekstowe nie rozpoznaje danych wejściowych z własnego widoku jako tekstu wejściowego.

Jeśli masz zwyczaj inputView, nie trzeba powołać się na tę metodę - wystarczy zaktualizować pole tekstowe bezpośrednio z IBAction:

- (IBAction) numberPadPressed: (UIButton *)sender { 
    NSString *newText = [[mytextField text] stringByReplacingCharactersInRange:[mytextField selectedRange] withString:string]; 
    [mytextField setText:newText]; 
} 
+0

Właśnie przetestowałem, korzystając z powyższej sugestii, ale nadal powinno się zmieniaćChangeCharactersInRange nie uruchamiał się podczas wywoływania metody numberPadPressed. Myślę, że jesteśmy na dobrej drodze ... – docchang

+0

Jak obliczyć zakres? Czy istnieje sposób przesuwania kursora w jakiejkolwiek określonej pozycji w polu TextField? – docchang

+0

Zaktualizowałem próbkę kodu. Użyj [mytextField selectedRange], aby uzyskać wybrany zakres, który będzie po prostu punktem wstawienia, jeśli nie będzie selekcji, lub będzie zakresem znaków, jeśli istnieje wybór. –

10

Nigdy nie dostanie shouldChangeCharactersInRange nazwie z niestandardowym klawiaturze .

Co można uzyskać, to wydarzenie UIControlEventEditingChanged z UITextField. Zamiast polegać na metodzie shouldChangeCharactersInRange (która jest również znana jako buggy), powinieneś polegać na tym zdarzeniu, które będzie uruchamiane za każdym razem, gdy użytkownik zmieni zawartość pola tekstowego.

[textField addTarget:self action:@selector(myTextfieldChangedMethod:) forControlEvents:UIControlEventEditingChanged]; 

Jeśli modyfikować własne pole tekstowe z niestandardowym klawiaturze, po prostu zadzwoń do tej metody, aby powiadomić wszystkich słuchaczy przypadku UIControlEventEditingChanged.

[textField sendActionsForControlEvents:UIControlEventTouchUpInside]; 
+0

Twoje "forControlEvents" powinny pasować do twojego 'sendActionsForControlEvents' –

0

Wiem, że to stare pytanie, ale wpadłem na ten sam problem z obsługą urządzeń z wersji 5.0. Jeśli przesłonisz insertText: postępując zgodnie z instrukcjami Roba pod numerem http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html, otrzymasz metodę shouldChangeCharactersInRange, która będzie uruchamiana za każdym razem.

Jeśli następnie trzeba wspierać klawisz Backspace jak ja można użyć odpowiedź od @cormacrelf na How to simulate the delete key on UITextField?

Jedynym snafu I nie były w stanie obejść to, że kiedy usunąć znak z w środku ciągu kursor przeskakuje z powrotem na koniec napisu.

Powiązane problemy