2012-07-16 9 views
9

Così mi sono guardato intorno un bel po ', e nulla qui sembra spiegare esattamente il modo corretto di farlo. Ho 7 campi UIText all'interno di un UITableViewCell personalizzato.Gestione delegato di UITextFields in Custom UITableViewCell

La mia domanda è questa: qual è il modo corretto di gestire il delegato di questi UITextFields?

Poiché le celle personalizzate sono tecnicamente parte della parte "modello" del progetto, preferirei che il controller che controlla l'UITableView controlli anche i campi di testo nelle celle della tabella, ma non riesco a capire come impostare il delegato per i campi di testo (che sono creati nella sottoclasse di UITableViewCell) a questo controller di visualizzazione.

Sarebbe una cattiva pratica semplicemente rendere la sottoclasse di UITableViewCell conforme al delegato UITextField e gestire tutte quelle cose lì dentro? Se sì, in quale altro modo dovrei fare questo?

Grazie, qualsiasi aiuto sarebbe apprezzato.

risposta

0

Il mio suggerimento sarebbe di "taggare" (cioè impostare il tag) di ogni campo di testo con un valore che codifica le viste di testo di sezione, riga e uno-di-7 nella tabella, quindi rendere il delegato UIViewController.

Quindi è necessario limitare la dimensione di questi - dire che non avrà mai più di 100 righe. Quindi si codifica come questo:

.tag = 1000 * 100 * + sezione + fila

Quando si riceve un messaggio che si può avere un metodo/funzione di prendere il tag e decodificare in sezione, fila, tag, e fai ciò che devi fare.

0

Per dichiarare che TableViewController come delegato include <UITextFieldDelegate> alla fine di @interface nel file .h di TableViewController.

@interface MyTableViewController : UITableViewController <UITextFieldDelegate> 

Quindi, collegare i campi di testo con Ctrl-trascinando ogni campo sotto il @interface. Ogni UITextField è collegato alla rispettiva proprietà da un IBOutlet. Infine, nel file .m includere la seguente funzione per mostrare il delegato quale campo si vuole tornare ....

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [aTextField resignFirstResponder]; 
    return YES; 
} 
6

A mio parere il cellulare dovrebbe gestire la tastiera in quanto è quello che sta tenendo la UITextField. È possibile impostare la cella come delegato UITextField. Nella mia applicazione, l'ho fatto e ho fatto in modo che la mia cella avesse il suo delegato. Qualsiasi metodo di UITextField o qualsiasi nuovo metodo che deve essere gestito dal controller può essere trasmesso al controllore tramite il delegato delle celle.

In questo modo la cella può essere ancora generica senza sapere nulla di ciò che l'applicazione sta effettivamente facendo.

+1

sono d'accordo. Per fare ciò, basta impostare il delegato nell'inizializzazione dell'implementazione di UITableViewCell. Ad esempio, nella chiamata awakeFromNib, aggiungi self.YourTextField.delegate = self. – JeffB6688

+0

Concordato che questo è il modo corretto per farlo. – GeneCode

16

Non si dovrebbe avere problemi nell'impostare il delegato del campo di testo della cella come controller di visualizzazione.

Questo è ciò che devi fare:

1) Il controller della vista ha la necessità di implementare il UITextFieldDelegate protocollo

2) dichiarare una proprietà per il campo di testo in cella personalizzato

@property (nonatomic, retain) IBOutlet UITextField *textField; 

3) Quindi impostare il controller di visualizzazione come delegato del campo di testo nel metodo cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"Cell"; 

    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell == nil) 
    { 
     // use this if you created your cell with IB 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomCell" owner:self options:nil] objectAtIndex:0]; 

     // otherwise use this 
     cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 


     // now set the view controller as the text field delegate 
     cell.textField.delegate = self; 
    } 

    // configure cell... 

    return cell; 
} 
+0

Grazie !! Ha funzionato per me –

0

versione Swift (in base alla risposta del Eyal)

class MyViewController: UIViewController, ... , UITextFieldDelegate { 

    @IBOutlet var activeTextField: UITextField! //doesn't need to connect to the outlet of textfield in storyboard 

    .... 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    .... 

    var cellTextField = self.view.viewWithTag(101) as? UITextField 
    cellTextField!.delegate = self; 
    .... 
}