2011-01-12 18 views
8

mytextField'da metni düzenlemek için kullanıyorum özel bir klavye var ve harika çalışıyor. Ancak, özel klavyemi kullanarak yürütmek için shouldChangeCharactersInRange temsilcisini asla alamıyorum. Gerçek klavyemi kullandığımda (mytextField.inputView = numberPad.view ayarlandığından) varsayılan iPhone klavyesi kullanılmadığında yürütülür. Özel klavye kullanılarak shouldChangeCharactersInRange temsilcisinin ateşlenmesine neden olmak için ne yapmalıyım? BTW, özel klavye sadece bir grup düğme.Özel inputView ile ateş için UITextFieldDelegate.shouldChangeCharactersInRange nasıl alabilirim?

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

cevap

0

Düzeltme: üzgünüz, sorunuzu daha önce yanlış anlamıştım. size metin aslında (örneğin bir kısayol tanımak ve bazı uzun metin eklemek için uygulamak olabilir) göstermek gerektiğini belirlemek için bir fırsat veren sistem klavyesi girdi aldığında

Metin alanı shouldChangeCharactersInRange çağırır. Ancak metin alanı, özel görünümünüzdeki girişi metin girişi olarak algılamaz.

Özel bir inputView varsa, bu yöntemi çağırmak gerekmez - sizin IBAction doğrudan metin alanını sadece güncellemek: Özel bir klavye ile adlandırılan shouldChangeCharactersInRange asla

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

Sadece önerinizi kullanarak test ettim, ancak hala NumberPadPressed çağrıldığındaChangeCharactersInRange çalışmadı. Sanırım doğru yoldayız ... – docchang

+0

Menzili nasıl hesaplayacağım? Bir TextField'da imleci herhangi bir pozisyonda hareket ettirmenin bir yolu var mı? – docchang

+0

Kod örneğini güncelledim. Seçili aralığı elde etmek için [mytextField selectedRange] öğesini kullanın; bu, seçim yapılmadığında yalnızca bir ekleme noktası olacak veya bir seçim varsa karakter aralığı olacaktır. –

10

.

Neler Alabilirsin? UITextField'un UIControlEventEditingChanged etkinliğidir. Bu nedenle, shouldChangeCharactersInRange yöntemine (buna ek olarak buggy olduğu bilinir) güvenmek yerine, kullanıcı bu metin alanının içeriğini her değiştirdiğinde, bu olaya güvenmeniz gerekir. Kendinize özel klavye ile metin alanını değiştirirseniz

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

, sadece olayın UIControlEventEditingChanged tüm dinleyicileri bildirmek için bu yöntemi çağırın.

[textField sendActionsForControlEvents:UIControlEventTouchUpInside]; 
+0

'forControlEvents', 'sendActionsForControlEvents' ile eşleşmelidir –

0

Bu eski bir soru olduğunu biliyorum ama önceden 5.0 cihazlarını desteklemek gerek aynı sorunla karşılaştık. InsertText'i geçersiz kılarsanız: http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html numaralı telefondan gelen talimatları izleyerek, her seferinde ateş etmek içinChangeCharactersInRange ürününü kullanacaksınız.

Sana How to simulate the delete key on UITextField?

de @cormacrelf cevabını kullanabilirsiniz vermedi gibi o zaman geçici bir çözüm mümkün olmamıştır tek snafu aralarından bir karakteri sildiğinizde olmasıdır geri tuşuna desteklemek için gerekirse Dizenin ortası, imleç dizginin sonuna geri atlar.

İlgili konular