我正在构建一个 View Controller ,我在其中添加了一堆 UITextField
以编程方式对我的看法。我想用我从 CoreData 加载的一些文本预先填充文本字段,但允许用户根据需要进入并更改该文本。然后我需要返回并将新文本再次保存回 CoreData,并使用新值执行计算。保存和加载本身不是问题,但我正在寻找一种跟踪用户更改内容的好方法。
过去,我使用 .tag
完成了此操作。 UITextField
的属性(property)和 textFieldDidEndEditing:
委托(delegate)方法。问题是我将在此 View 中包含数十个文本字段 - 足以让我记不清是什么 .tag
属于我模型中的什么变量。不得不回去查看我在创建时分配的标签会很痛苦,而且整个事情感觉真的很容易出错。此外,我将在多个不同的循环中创建文本字段,因此在创建时为每个文本字段获取唯一标签将很困难(也许不可能?)。
我正在寻找的是一种在创建模型时将 UITextField 与模型中的变量“绑定(bind)”的方法,并且从那时起就知道,每当用户更新该文本字段时,我在模型中指定的值将立即生效更新以用于将来的计算,并在用户离开屏幕时保存回 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 的建议时,我开始阅读 tutorial on pointers in C .这似乎是我需要走的路,但我正在努力获得
&
和 *
与我在上次来自 Objective-C 世界的 EDIT 中提到的 NSObject 子类配合得很好。为了让@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 世界中的工作方式仍然有些模糊,而且我认为有些事情我还没有完全理解。
最佳答案
您可以使用 UITextField+blocks它可能会少一些纠缠。如果对象具有相似的接口(interface)或使用类似 setText:
的方法实现一种协议(protocol)会容易得多。 .
关于ios - 有没有办法自动将 UITextField 绑定(bind)到我的数据模型中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18084180/