UITextField
我正在构建一个视图控制器,我在其中以编程方式将一堆s 添加到我的视图中。我想用我从 CoreData 加载的一些文本预先填充文本字段,但如果他们愿意,允许用户进入并更改该文本。然后我需要返回并将新文本再次保存回 CoreData,并使用新值执行计算。保存和加载本身不是问题,但我正在寻找一种跟踪用户更改内容的好方法。
过去,我使用the和委托方法的.tag
属性来完成此操作。问题是我将在这个视图中有几十个文本字段 - 足以让我不记得什么属于我的模型中的哪个变量。必须回去查看我在创建它时分配的标签会很痛苦,而且整个事情感觉真的很容易出错。此外,我将在多个不同的循环中创建文本字段,因此在创建时为每个文本字段获取一个唯一的标签将很困难(也许不可能?)。UITextField
textFieldDidEndEditing:
.tag
我正在寻找的是一种在创建 UITextField 时将其“绑定”到模型中的变量的方法,并且从那时起就知道,每当用户更新该文本字段时,我在模型中指定的值将立即生效更新以用于将来的计算,并在用户离开屏幕时保存回 CoreData。有没有办法做到这一点?
编辑 1:要注意的另一件事是我的模型本身有点复杂。我有几个不同的自定义NSObject
子类,它们都保存着不同的数据。一些对象的属性本身就是其他自定义对象。我也有字典,其中的值将是一些自定义对象的实例。
例如,我可能有这些对象:
MySmallObject1
, 具有属性name
,size
, 和value
(allNSStrings
)MySmallObject2
, 它具有属性date
andcost
(anNSDate
和 anNSNumber
)MyBigObject
,它具有属性box1
和box2
(分别是MySmallObject1
和MySmallObject2
实例)theDict
,这是一个以s 为值的NSDictionary
实例MyBigObject
因此,当我构建我的文本字段时,我实际上可能会沿着一棵看起来像这样的树走下去:
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 世界的&
and*
与我在 Objective-C 世界的最后一次编辑中提到的 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
增加,这样我就可以保持它的独特性。我想在这种情况下,我可以简单地使用 an并且它也可以正常工作,并且可能看起来更干净一些。我的计划是像我一样使用: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世界中的工作方式仍然有点模糊,我认为有些东西我还没有完全理解。