2011-10-12 30 views
8

Sto tentando di utilizzare textFieldShouldBeginEditing per disattivare la tastiera da mostrare per un UITextField personalizzato. Sto implementando tutti i metodi UITextFieldDelegate. Tuttavia, per qualche motivo, textFieldShouldBeginEditing non viene mai chiamato.textFieldShouldBeginEditing non viene chiamato

I seguenti metodi delegato sempre arrivare chiamati:

– textFieldDidBeginEditing: 
– textFieldShouldEndEditing: 
– textFieldDidEndEditing: 

La vista è strutturato nel modo seguente:

UIViewController che detiene una ScrollView. A seconda dello stato della vista, questo ScrollView conterrà un UIView con un elenco personalizzato UITextFields.

Sto utilizzando iOS 4.3.5 (8L1) su questo dispositivo.

Qualche idea?

Modifica; aggiunti alcuni frammenti di codice:

UIViewController ha la seguente interfaccia

@interface AViewController: UIViewController<UITextFieldDelegate> 

Una volta caricato l'UIViewController, mi collego tutte UITextFields alla vista utilizzando

aSubView.aTextField.delegate = self; 

(semplificato) implementazioni delegato situati in AViewController

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    return YES; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    return YES; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    return YES; 
} 

Personalizzato UITextField codice

semplificato file di implementazione -

#import "PVEntryTextField.h" 
#import "EntryViewController.h" 

@implementation PVEntryTextField 
@synthesize isPasswordField, state, singleTap; 

- (id)initWithCoder:(NSCoder *)inCoder 
{ 
    if (self = [super initWithCoder:inCoder]) 
    { 
     self.font = [UIFont fontWithName:@"Helvetica-Bold" size:19]; 
     self.textColor = [UIColor colorWithRed:51.0/255.0 
             green:51.0/255.0 
              blue:51.0/255.0 
             alpha:1.0]; 
     self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
    } 

    return self; 
} 

- (CGRect)textRectForBounds:(CGRect)bounds 
{ 
    return CGRectMake(bounds.origin.x + 16, bounds.origin.y, 
         bounds.size.width - 16*2 - 10, bounds.size.height); 
} 

- (CGRect) editingRectForBounds:(CGRect)bounds 
{ 
    return [self textRectForBounds:bounds]; 
} 

- (BOOL) canBecomeFirstResponder 
{ 
    return YES; 
} 

- (void) updateState:(int) newState 
{ 
    state = newState; 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

@end 
+0

Se gli altri metodi delegato vengono chiamati per lo stesso campo di testo, e le tue textfields non sono sottoclassi o qualsiasi cosa, questo può essere solo un errore di battitura nel nome del metodo. – jrturton

+0

Ho sottoclasse UITextField per apportare alcune modifiche all'aspetto del campo di testo. Tuttavia, non ho effettivamente toccato nulla relativo ai delegati. – Charles

+0

Non ne sono sicuro, ma è possibile che "textFieldShouldBeginEditing" venga chiamato dall'implementazione predefinita del metodo "canBecomeFirstResponder"? Prova a implementare il metodo con [super canBecomeFirstResponder] o semplicemente rimuovendolo. – lluismontero

risposta

13

È posible che textFieldShouldBeginEditing viene chiamato dall'implementazione predefinita del metodo canBecomeFirstResponder?

Provare ad implementare il metodo con [super canBecomeFirstResponder] o semplicemente rimuoverlo.

+0

Grazie! Ho avuto una sottoclasse di 'UITextField' che sovrascrive' canBecomeFirstResponder' a causa di alcuni test empirici.Per totale mancato. – mkko

13

Avete impostato il delegato UITextField al "sé"?

+0

UITextField delegato è impostato su self. Tuttavia, questo viene chiamato dal principale UIViewController. L'implementazione dei metodi delegati si trova anche nel principale UIViewController. – Charles

+0

È necessario impostare il delegato UITextView sulla classe che implementa i metodi UITextViewDelegate – lluismontero

+0

Sì, è quello che ho fatto. :) – Charles

0

Non so se è un errore di battitura su come copiare il codice qui, ma il nome del metodo non è corretto:

CORRETTO - textFieldShouldBeginEditing

YOURS - textFieldShoulBeginEditing (missing "d")

+0

Errore di copia. :( – Charles

+2

che avrebbe fatto solo un errore di compilazione ... –

2

Per tutti coloro che vengono qui e non hanno trovato una soluzione. Il mio problema era che ho creato il campo di testo in IB e poi ne assegnavo uno nel mio viewDidLoad. Quando ho rimosso l'istanza, il delegato ha funzionato correttamente poiché era legato alla TF corretta.

//I REMOVED these two lines because I created the textfield in IB 
_nameTextField = [[UITextField alloc] init]; 
_priceTextField = [[UITextField alloc] init]; 


[_nameTextField setDelegate:self]; 
[_priceTextField setDelegate:self]; 
2

Ho anche corse in tema di non avere textFieldShouldEndEditing o textFieldShouldReturn chiamato. Ciò si è verificato dopo aver aggiornato lo Storyboard della mia app.

I metodi delegati venivano richiamati quando UITextFields parte della sottoclasse ViewController.

Tuttavia, quando sono stati spostati in una vista di scorrimento all'interno del ViewController, i metodi non venivano più chiamati.

L'impostazione dei delegati dell'app su Self ViewDidLoad ha risolto il problema.

self.emailField.delegate = self; 
self.passwordField.delegate = self; 
+0

INCREDIBILE. Nella mia situazione, ho una vista che viene presentata in un controller di navigazione, e nulla funzionava correttamente ... tocca eventi, caselle di testo, ecc. Ho assegnato i delegati come hai suggerito e ha funzionato ... totalmente schifo. –

0

In Swift-3 seguente metodo necessaria "_" prima textField in modo che questo metodo delegato chiamerà. Nel mio caso mi aiuta

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { 
} 
Problemi correlati