2012-07-16 27 views
9

Así que he mirado un poco, y nada aquí parece explicar exactamente la forma correcta de hacerlo. Tengo 7 UITextFields dentro de una UITableViewCell personalizada.Delegado de gestión de UITextFields en UITableViewCell personalizado

Mi pregunta es esta: ¿Cuál es la forma correcta de administrar el delegado de estos UITextFields?

Dado que las celdas personalizadas son técnicamente parte de la parte "modelo" del proyecto, prefiero que el controlador que controla la UITableView también controle los campos de texto en las celdas de la tabla, pero no entiendo cómo configurarlas el delegado para los campos de texto (que se crean en la subclase de UITableViewCell) para este controlador de vista.

¿Sería una mala práctica simplemente hacer que la subclase de UITableViewCell se conforme al delegado UITextField y administrar todas esas cosas allí? Si es así, ¿de qué otra manera debería hacer esto?

Gracias, cualquier ayuda sería apreciada.

Respuesta

0

Mi sugerencia sería "etiquetar" (es decir, establecer la etiqueta) de cada campo de texto con un valor que codifica la sección, fila y una de las 7 vistas de texto en la tabla, luego haga que el delegado UIViewController.

Por lo tanto, debe limitar el tamaño de estos, digamos que nunca tendrá más de 100 filas. Así codificar esto como:

.tag = 1000 * 100 * + sección fila +

cuando se obtiene un mensaje que puede tener un método/función de tomar la etiqueta y decodificar en la sección, fila, etiqueta, y haz lo que necesitas haber hecho.

0

Para declarar su TableViewController como delegado, incluya <UITextFieldDelegate> al final de su @interface en el archivo .h de TableViewController.

@interface MyTableViewController : UITableViewController <UITextFieldDelegate> 

A continuación, conecte los campos de texto ctrl-arrastrando cada campo bajo el @interface. Cada UITextField está conectado a su propiedad respectiva por un IBOutlet. Por último, en el archivo .m incluir la siguiente función para mostrar el delegado de campo, que desea volver ....

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

En mi opinión la célula debe manejar el teclado, ya que es la que está llevando a cabo la UITextField. Puede configurar su celda como el delegado UITextField. En mi propia aplicación, hice esto y luego hice que mi celular tuviera su propio delegado. Cualquiera de los métodos de UITextField o cualquier método nuevo que deba manejar el controlador se puede pasar al controlador a través del delegado de células.

De esta forma, la célula puede ser genérica sin saber nada de lo que la aplicación realmente está haciendo.

+1

estoy de acuerdo. Para lograr esto, simplemente configure al delegado en la inicialización de su implementación de UITableViewCell. Por ejemplo, en la llamada awakeFromNib, simplemente agrega self.YourTextField.delegate = self. – JeffB6688

+0

De acuerdo, esta es la forma correcta de hacerlo. – GeneCode

16

No debería tener un problema al establecer que el delegado del campo de texto de la celda sea su controlador de vista.

Esto es lo que hay que hacer:

1) El controlador de vista hay que poner en práctica el UITextFieldDelegate protocolo

2) Declarar una propiedad para el campo de texto en su celular a medida

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

3) Luego configure el controlador de visualización como el delegado del campo de texto en el método 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

¡Gracias! Trabajó para mi –

0

versión Swift (Basado en la respuesta de 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; 
    .... 
} 
Cuestiones relacionadas