Czy istnieje sposób automatycznego powiązania UITextField ze zmienną w moim modelu danych?
Buduję kontroler widoku, w którym dodam kilkaUITextField
s moim zdaniem programowo. Chcę wstępnie wypełnić pola tekstowe jakimś tekstem, który ładuję z CoreData, ale pozwól użytkownikowi wejść i zmienić ten tekst, jeśli chcą. Następnie muszę wrócić i zapisać ten nowy tekst ponownie w CoreData, a także wykonać obliczenia przy użyciu nowej wartości. Samo zapisywanie i ładowanie nie stanowi problemu, ale szukam dobrego sposobu śledzenia tego, co zmienił użytkownik.
W przeszłości robiłem to za pomocą.tag
własnośćUITextField
itextFieldDidEndEditing:
metoda delegowania. Problem polega na tym, że w tym widoku będę miał dziesiątki pól tekstowych - na tyle, że naprawdę nie pamiętam co.tag
należy do jakiej zmiennej w moim modelu. Wracając, aby sprawdzić, jaki tag przypisałem, kiedy go stworzyłem, będzie to ból, a cała sprawa jest bardzo podatna na błędy. Dodatkowo, zamierzam tworzyć pola tekstowe w wielu różnych pętlach, więc uzyskanie unikalnego tagu dla każdego pola tekstowego podczas jego tworzenia będzie trudne (może niemożliwe?).
To, czego szukam, to sposób „powiązania” UITextField ze zmienną w moim modelu, gdy ją tworzę i wiem od tego momentu, kiedy użytkownik zaktualizuje to pole tekstowe, wartość określona w moim modelu będzie natychmiastowa zaktualizowany do wykorzystania w przyszłych obliczeniach i zapisywania z powrotem do CoreData, gdy użytkownik opuszcza ekran. Czy istnieje sposób, aby to zrobić?
EDYCJA 1: Inną rzeczą do odnotowania jest to, że mój model jest dość złożony. Mam kilka różnych zwyczajówNSObject
podklasy, które zawierają różne części moich danych. Niektóre obiekty mają właściwości, które same w sobie są innymi obiektami niestandardowymi. Mam także słowniki, w których wartości będą instancjami niektórych obiektów niestandardowych.
Jako przykład mogę mieć następujące obiekty:
MySmallObject1
, który ma właściwościname
,size
, ivalue
(wszystkoNSStrings
)MySmallObject2
, który ma właściwościdate
icost
(naNSDate
i anNSNumber
)MyBigObject
, który ma właściwościbox1
ibox2
(które sąMySmallObject1
iMySmallObject2
instancje, odpowiednio)theDict
, który jestNSDictionary
przykład, który maMyBigObject
s jako wartościWięc kiedy buduję moje pola tekstowe, być może rzeczywiście pójdę w dół drzewa, które wyglądałoby mniej więcej tak:
for (NSString *key in [theDict allKeys])
{
UITextField *txt = [[UITextField alloc] initWithFrame:...];
txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name];
[self.view addSubview:txt];
}
W tym przypadku muszę wiedzieć, kiedy użytkownik zmienia tekst w dowolnym ztxt
i zaktualizuj odpowiednią wartość za pomocą drzewa.
EDYCJA 2: Podczas próby implementacji sugestii @ Till w komentarzach, zacząłem czytaćtutorial na temat wskaźników w C. Wygląda na to, że tak właśnie muszę iść, ale staram się zdobyć&
i*
ze świata C, aby dobrze grać z podklasami NSObject, o których wspominałem w moim ostatnim EDIT ze świata Objective-C. Aby sugestia @ Tilla zadziałała, myślę, że muszę w jakiś sposób zapisać lokalizację pamięci mojej wartości w tym skomplikowanym drzewie obiektów. Tak więc mój kod z ostatniego EDIT stałby się:
.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];
}
GdzieglobalCounter
jestint
że zwiększam za każdym razem, gdy coś wkładamtagDict
więc mogę zachować to wyjątkowe. Myślę, że w tym przypadku mógłbym po prostu użyćNSArray
i będzie działać równie dobrze i prawdopodobnie będzie wyglądać trochę czysto. Mój plan to wykorzystanietagDict
w moimtestFieldDidEndEditing
lubić:
- (void) textFieldDidEndEditing:(UITextField *)textField
{
*[tagDict objectForKey:[NSString stringWithFormat:@"%d",textField.tag]] = textField.txt;
}
To powoduje błąd dlaAssigning to 'id' from incompatible type 'NSString *'
. Nie jestem pewien, co to znaczy. Czy istnieje sposób, w jaki mogę użyć „operatora wyłuskiwania”, aby zmienić wartość elementu, na który wskazuję w moim słowniku?
rzuca błądAddress expression must be an lvalue or a function designator
. Nadal jestem trochę rozmyty, jak ten wskaźnik będzie działał w świecie Objective C i myślę, że jest coś, czego nie rozumiem w pełni.