Existe uma maneira de vincular automaticamente um UITextField a uma variável no meu modelo de dados?
Eu estou construindo um controlador de visão onde estou adicionando um monte deUITextField
s para a minha opinião de forma programática. Eu quero pré-preencher os campos de texto com algum texto que estou carregando do CoreData, mas permitir que o usuário entre e mude o texto, se quiser. Em seguida, preciso voltar e salvar o novo texto de volta no CoreData novamente, além de executar cálculos usando o novo valor. O salvamento e o carregamento em si não são um problema, mas estou procurando uma boa maneira de rastrear o que o usuário mudou.
No passado, fiz isso com o.tag
propriedade doUITextField
e atextFieldDidEndEditing:
delegate method. O problema é que eu vou ter dezenas de campos de texto nessa visão - o suficiente para que eu não consiga lembrar.tag
pertence a qual variável no meu modelo. Ter que voltar para procurar a tag que eu atribuí quando criei será uma dor, e a coisa toda parece realmente propensa a erros. Além disso, vou criar os campos de texto em vários loops diferentes, de modo que obter uma marcação única para cada campo de texto quando for criado será difícil (talvez impossível?).
O que eu estou procurando é uma maneira de "amarrar" o UITextField a uma variável no meu modelo quando eu o criar e só saber a partir desse ponto, sempre que o usuário atualizar esse campo de texto, o valor que eu especificar no meu modelo será instantaneamente atualizado para ser usado em cálculos futuros e salvando de volta no CoreData quando o usuário sair da tela. Existe uma maneira de fazer isso?
EDIT 1: Outra coisa a notar é que o meu modelo em si é meio complexo. Eu tenho vários costumes diferentesNSObject
subclasses que estão segurando partes diferentes dos meus dados. Alguns dos objetos têm propriedades que são eles próprios outros objetos personalizados. Eu também tenho dicionários onde os valores serão instâncias de alguns dos objetos personalizados.
Por exemplo, eu posso ter esses objetos:
MySmallObject1
, que tem propriedadesname
,size
evalue
(todosNSStrings
)MySmallObject2
, que tem propriedadesdate
ecost
(aNSDate
e umNSNumber
)MyBigObject
, que tem propriedadesbox1
ebox2
(que sãoMySmallObject1
eMySmallObject2
instâncias, respectivamente)theDict
, que é umNSDictionary
instância que temMyBigObject
s como valoresEntão, quando estou construindo meus campos de texto, eu posso estar realmente descendo por uma árvore que seria algo como:
for (NSString *key in [theDict allKeys])
{
UITextField *txt = [[UITextField alloc] initWithFrame:...];
txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name];
[self.view addSubview:txt];
}
Nesse caso, preciso saber quando o usuário altera o texto em qualquer um dostxt
e atualize o valor apropriado através da árvore.
EDIT 2: Ao tentar implementar a sugestão de @ Till nos comentários, comecei a ler umtutorial sobre ponteiros em C. Parece que esta é a maneira que eu preciso ir, mas eu estou lutando para obter o&
e*
do mundo C para jogar bem com as subclasses NSObject que mencionei no meu último EDIT do mundo Objective-C. Para que a sugestão de @ Till funcione, acho que preciso armazenar de alguma forma a localização da memória do meu valor nessa complicada árvore de objetos. Então meu bloco de código do último EDIT se tornaria:
.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];
}
OndeglobalCounter
é umint
que estou incrementando toda vez que coloco algo emtagDict
então eu posso mantê-lo único. Eu acho que neste caso eu poderia simplesmente estar usando umNSArray
e funcionaria tão bem, e provavelmente pareceria um pouco mais limpo. Meu plano é usartagDict
no meutestFieldDidEndEditing
gostar:
- (void) textFieldDidEndEditing:(UITextField *)textField
{
*[tagDict objectForKey:[NSString stringWithFormat:@"%d",textField.tag]] = textField.txt;
}
Isso gera um erro paraAssigning to 'id' from incompatible type 'NSString *'
. Eu não tenho certeza do que isso significa. Existe uma maneira que eu possa usar um "operador de desreferenciação" para alterar o valor do item que estou apontando no meu dicionário?
lança um erroAddress expression must be an lvalue or a function designator
. Ainda estou um pouco confuso sobre como essa coisa de ponteiro funcionaria no mundo do Objective C, e acho que há algo que não entendo completamente.