Domanda

Ho una sottoclasse di un UIView (MyView) che ha alcuni UITextField come sottoviste.MyView implementa il protocollo UITextFieldDelegate per essere avvisato quando si fa clic sui campi di testo.Funzionava bene.Ora ho bisogno di posizionare i campi di testo in una sorta di "contenitore" per essere in grado di sfumare in entrata e in uscita questo contenitore (e tutti i suoi figli) con un'animazione UIView.Quindi ho creato una UIView (MySubview), l'ho resa sottoview di MyView e ho inserito tutti i campi di testo al suo interno.L'animazione funziona bene ma il UITextFieldDelegate non viene più chiamato.Penso che sia perché i campi di testo non sono più figli diretti di MyView. Esistono altri modi per affrontare questo problema?

AGGIORNAMENTO

Ho fatto una piccola versione del mio codice, forse questo aiuta a trovare il problema:

@interface MyView : UIView <UITextFieldDelegate>


@implementation MyView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        // This is MySubview:
        UIView *tempLabelsContainer = [[UIView alloc] initWithFrame:self.bounds];
        [tempLabelsContainer setUserInteractionEnabled:YES];
        [self addSubview:tempLabelsContainer];
        self.labelsContainer = tempLabelsContainer;
        [tempLabelsContainer release];

        UITextField *aTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
        [aTextField setBackgroundColor:[UIColor clearColor]];
        [aTextField setText:@"Some text"];
        [aTextField setTag:1];
        [aTextField setDelegate:self];
        [self.labelsContainer addSubview:aTextField];
        [aTextField release];

        // More labels are being added
    }

    return self;
}

#pragma mark - UITextFieldDelegate methods

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // This is not being called
    NSLog(@"TextField with the tag: %d should be edited", [textField tag]);    

    return NO;
}
È stato utile?

Soluzione 2

Risponderò alla mia domanda solo nel caso in cui qualcuno abbia lo stesso problema - difficile immaginare che qualcuno faccia un errore così stupido, però:

Stavo impostando il frame del contenitore delle etichette su self.bounds.Ma il MyViewController stava creando MyView con un frame di CGRectZero!Ho apportato questa modifica per supportare l'animazione nello stesso momento in cui ho aggiunto il contenitore.Pertanto ho pensato che il problema avesse a che fare con la gerarchia della vista.Mi vergogno!!!

Comunque, grazie a tutti gli aiutanti, in particolare a Madhumal Gunetileke che, con la sua risposta, mi ha fatto guardare in una direzione diversa.

Altri suggerimenti

Ok allora, ho provato a scrivere il tuo codice e per me funziona.Ecco alcuni elementi che potresti provare a cambiare;

  • Il motivo per cui non puoi modificare il tuo textField è perché stai restituendo NO al metodo textFieldShouldBeginEditing.Cambia questo in SÌ.
  • Prova a posizionare (se possibile) il tuo textField un po 'più in basso di quello che hai fornito.Inoltre, 20px è comunque troppo piccolo per un campo di testo appropriato, rendilo almeno 40px.Un campo di testo di 20 px posizionato a 0,0 potrebbe essere nascosto del tutto se la barra di stato è attivata nel telefono.
  • Imposta un borderStyle per il tuo textField.Per quanto ne so, questo è importante affinché un textField si presenti e interagisca bene.(ad es. textField.borderStyle= UITextBorderStyleRoundRect)

Incrociamo le dita!:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top