Есть ли способ автоматически связать UITextField с переменной в моей модели данных?
Я строю контроллер представления, где я добавляю кучуUITextField
с моей точки зрения программно. Я хочу предварительно заполнить текстовые поля некоторым текстом, который я загружаю из 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, и я думаю, что есть кое-что, что я не до конца понимаю.