¿Hay alguna manera de vincular automáticamente un UITextField a una variable en mi model de datos?

Estoy creando un controller de vista donde agrego un montón de UITextField s a mi vista mediante progtwigción. Quiero rellenar previamente los campos de text con algún text que estoy cargando desde CoreData, pero permito que el usuario entre y cambie ese text si lo desean. Luego necesito volver y save ese nuevo text nuevamente en CoreData, así como realizar cálculos usando el nuevo valor. El ahorro y la carga en sí no es un problema, pero estoy buscando una buena forma de rastrear lo que el usuario ha cambiado.

En el pasado, he hecho esto con la propiedad .tag del UITextField y el método textFieldDidEndEditing: delegate. El problema es que voy a tener decenas de campos de text en esta vista, lo suficiente para que realmente no pueda recordar qué .tag pertenece a qué variable en mi model. Tener que volver a search qué label asigné cuando creé va a ser un dolor, y todo se siente realmente propenso a errores. Además, voy a crear los campos de text en múltiples loops diferentes, por lo que get una label única para cada campo de text cuando lo creo será difícil (¿quizás imposible?).

Lo que estoy buscando es una forma de "vincular" el UITextField a una variable en mi model cuando lo creo y solo sé desde ese momento, siempre que el usuario actualice ese campo de text, el valor que especifique en mi model será instantáneamente actualizado para ser utilizado en futuros cálculos y guardado en CoreData cuando el usuario abandona la pantalla. ¿Hay alguna forma de hacer esto?

EDIT 1: Otra cosa a tener en count es que mi model en sí mismo es algo complejo. Tengo varias subclasss de NSObject personalizadas diferentes que contienen diferentes partes de mis datos. Algunos de los objects tienen properties que a su vez son otros objects personalizados. También tengo dictionarys donde los valores serán ejemplos de algunos de los objects personalizados.

Como ejemplo, podría tener estos objects:

  • MySmallObject1 , que tiene name , size y value properties (todos NSStrings )
  • MySmallObject2 , que tiene properties de date y cost (un NSDate y un NSNumber )
  • MyBigObject , que tiene properties box1 y box2 (que son MySmallObject1 y MySmallObject2 instances, respectivamente)
  • theDict , que es una instancia de NSDictionary que tiene MyBigObject s como valores

Entonces, cuando estoy construyendo mis campos de text, podría estar bajando un tree que se parecería a:

 for (NSString *key in [theDict allKeys]) { UITextField *txt = [[UITextField alloc] initWithFrame:...]; txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name]; [self.view addSubview:txt]; } 

En este caso, necesito saber cuándo el usuario cambia el text en cualquiera de los txt y actualizar el valor apropiado a través del tree.

EDIT 2: Al tratar de implementar la sugerencia de @ Till en los comentarios, empecé a leer un tutorial sobre pointers en C. Parece que esta es la forma en que tengo que ir, pero estoy luchando para que el & * del mundo C juegue bien con las subclasss NSObject que menciono en mi último EDIT del mundo Objective-C. Para que la sugerencia de @ Till funcione, creo que necesito almacenar de alguna manera la location de memory de mi valor en ese complicado tree de objects. Entonces, mi bloque de código de la última EDIT se convertiría en:

 .h @property (nonatomic, strong) NSMutableDictionary *tagDict; .m for (NSString *key in [theDict allKeys]) { UITextField *txt = [[UITextField alloc] initWithFrame:...]; txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name]; txt.tag = globalCounter; [tagDict addObject:[[(MyBigObject *)[theDict objectForKey:key] box1] name] forKey:[NSString stringWithFormat:@"%d",globalCounter]]; globalCounter ++; [self.view addSubview:txt]; } 

Donde globalCounter es un int que estoy incrementando cada vez que pongo algo en tagDict para que pueda mantenerlo único. Supongo que en este caso podría simplemente usar un NSArray y funcionaría igual de bien, y probablemente se vea un poco más limpio. Mi plan es utilizar tagDict en mi testFieldDidEndEditing como:

 - (void) textFieldDidEndEditing:(UITextField *)textField { *[tagDict objectForKey:[NSString stringWithFormat:@"%d",textField.tag]] = textField.txt; } 

Esto genera un error para Assigning to 'id' from incompatible type 'NSString *' . No estoy realmente seguro de qué significa eso. ¿Hay alguna forma en que pueda usar un "operador de reference" para cambiar el valor del elemento al que apunto en mi dictionary?

lanza un error La Address expression must be an lvalue or a function designator . Sigo siendo un poco confuso sobre cómo funcionaría este puntero en el mundo del Objetivo C, y creo que hay algo que no entiendo completamente.

Puede usar bloques UITextField + puede estar less ennetworkingado. Y será mucho más fácil si los objects tienen una interfaz similar o implementan un protocolo con un método como setText:

Podría usar su enfoque original con el .tag, pero use typedefs.

 typedef enum TFTypes { TFModalType1, TFModalType2, TFModalType3, TFModalType4, TFModalType5, ... } TFType; 

Terminé haciendo en gran parte lo que creo que @Till estaba tratando de sugerir. NSMutableArray *tieArray un NSMutableArray *tieArray y un int tieCounter como @properties a mi controller de vista. Mi código para build UITextFields desde el primer bloque de código en mi OP ahora es:

 for (NSString *key in [theDict allKeys]) { UITextField *txt = [[UITextField alloc] initWithFrame:...]; txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name]; [self.view addSubview:txt]; txt.tag = self.tieCounter; self.tieCounter ++; [self.tieArray addObject:[[(MyBigObject *)[theDict objectForKey:key] box1] name]]; } 

Luego en mi textFieldDidEndEditing

 - (void) textFieldDidEndEditing:(UITextField *)textField { if ([tieArray objectAtIndex:textField.tag] isKindOfClass:[NSMutableString class]]) { [(NSMutableString *)[tieArray objectAtIndex:textField.tag] setString:textField.text]; } else if (//...More conditions to set other variable types with the syntax as needed) } 

Tenga en count que para que esto funcione, todas las properties de MySmallObject1 y MySmallObject2 deben estar cubiertas por un isKindOfClass: check, y la syntax real variará un poco dependiendo de la class de esa propiedad.

No he podido probar esto todavía (y mi aplicación probablemente no estará en un estado comprobable durante bastante time), pero tiene sentido para mí, y no arroja ningún error o advertencia. Si tengo problemas con esto cuando lo ejecuto, actualizaré aquí.