Есть ли способ автоматически связать UITextField с переменной в моей модели данных?
я строю контроллер представления, где ям добавив кучуUITextField
с моей точки зрения программно. Я хочу предварительно заполнить текстовые поля текстом, который яm загружается из CoreData, но позволяет пользователю войти и изменить этот текст, если он хочет. Затем мне нужно вернуться и снова сохранить этот новый текст обратно в CoreData, а также выполнить вычисления с использованием нового значения. Само сохранение и загрузка неэто проблема, но яЯ ищу хороший способ отследить, что изменил пользователь.
В прошлом ямы сделали это с.tag
собственностьUITextField
иtextFieldDidEndEditing:
метод делегата. Проблема в том, что яЯ собираюсь иметь десятки текстовых полей в этом представлении - достаточно, чтобы я могдействительно помню что.tag
принадлежит к какой переменной в моей модели. Необходимость вернуться назад, чтобы посмотреть, какой тег я назначил при создании, будет болезненным, и все это кажется действительно подверженным ошибкам. Кроме того, яЯ собираюсь создавать текстовые поля в нескольких различных циклах, поэтому получение уникального тега для каждого текстового поля при его создании будет затруднено (возможно, невозможно?).
Что я'ищу способ "галстук" UITextField для переменной в моей модели, когда я ее создаю и просто знаю с этого момента, когда пользователь обновляет это текстовое поле, значение, которое я указываю в моей модели, будет немедленно обновляться для использования в будущих вычислениях и сохранения обратно в CoreData когда пользователь покидает экран. Есть ли способ сделать это?
РЕДАКТИРОВАТЬ 1: Еще одна вещь, чтобы отметить, что моя модель сама по себе довольно сложная. У меня несколько разных кастомовNSObject
подклассы, которые содержат разные части моих данных. Некоторые из объектов имеют свойства, которые сами являются другими пользовательскими объектами. У меня также есть словари, где значения будут экземплярами некоторых пользовательских объектов.
В качестве примера у меня могут быть следующие объекты:
MySmallObject1
, который имеет свойства,name
size
, а такжеvalue
(все )NSStrings
MySmallObject2
, который имеет свойстваdate
а такжеcost
(NSDate
и)NSNumber
MyBigObject
, который имеет свойстваbox1
а такжеbox2
(которыеMySmallObject1
а такжеMySmallObject2
экземпляры соответственно)theDict
, который являетсяNSDictionary
экземпляр, который имеетMyBigObject
s как значенияПоэтому, когда я создаю свои текстовые поля, я могу спуститься по дереву, которое будет выглядеть примерно так:
for (NSString *key in [theDict allKeys])
{
UITextField *txt = [[UITextField alloc] initWithFrame:...];
txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name];
[self.view addSubview:txt];
}
В этом случае мне нужно знать, когда пользователь изменяет текст в любом изtxt
и обновите соответствующее значение через дерево.
РЕДАКТИРОВАТЬ 2: пытаясь реализовать @Till 'С предложением в комментариях я начал читатьучебник по указателям в C, Кажется, мне нужно идти по этому пути, но яя изо всех сил, чтобы получить&
а также*
из мира C, чтобы хорошо играть с подклассами NSObject, о которых я упоминал в своем последнем редактировании из мира Objective-C. Чтобы получить @ Till 'С предложением работать, я думаю, мне нужно каким-то образом сохранить место в памяти моего значения в этом сложном дереве объектов. Таким образом, мой блок кода из последней редакции стал бы:
.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];
}
кудаglobalCounter
являетсяint
что я'м увеличивается каждый раз, когда я кладу что-то вtagDict
так что я могу сохранить его уникальным. Я думаю, что в этом случае я мог бы просто использоватьNSArray
и это будет работать так же хорошо, и, вероятно, выглядит немного чище. Мой план заключается в использованииtagDict
в моемtestFieldDidEndEditing
лайк:
- (void) textFieldDidEndEditing:(UITextField *)textField
{
*[tagDict objectForKey:[NSString stringWithFormat:@"%d",textField.tag]] = textField.txt;
}
Это выдает ошибку дляAssigning to 'id' from incompatible type 'NSString *'
, Я'Я не совсем уверен, что это значит. Есть ли способ, которым я могу использоватьоператор разыменования изменить значение элемента, на который я указываю в своем словаре?
выдает ошибкуAddress expression must be an lvalue or a function designator
, Я'Я все еще немного размышляю о том, как этот указатель будет работать в мире Objective C, и я думаю, чточто-то яЯ не совсем понимаю.