2013-08-06 13 views
4

我正在建立一个视图控制器,我在其中以编程方式添加一串UITextField到我的视图。我想用我从CoreData加载的一些文本预先填充文本字段,但允许用户进入并更改文本(如果他们想要的话)。然后我需要返回并再次将新文本保存回CoreData,并使用新值执行计算。保存和加载本身不是问题,但我正在寻找一种跟踪用户变化的好方法。有没有办法将UITextField自动绑定到我的数据模型中的变量?

在过去,我已使用UITextFieldtextFieldDidEndEditing:委托方法的.tag属性完成此操作。问题是我在这个视图中会有几十个文本框 - 足以让我不记得.tag属于我模型中的变量。当我创建它时,不得不回头查看我分配的标签是一件痛苦的事情,而整件事情真的很容易出错。另外,我将在多个不同的循环中创建文本字段,因此,在创建文本字段时为每个文本字段获取唯一标记将很困难(也许不可能?)。

我正在寻找的是一种将UITextField“绑定”到我的模型中的变量的方法,当我创建它时,只要知道该点,每当用户更新该文本字段时,我在我的模型将立即更新以供将来计算使用,并在用户离开屏幕时保存回CoreData。有没有办法做到这一点?

编辑1:另外要注意的是,我的模型本身有点复杂。我有几个不同的自定义NSObject子类,它们都拥有不同的数据。一些对象具有本身是其他自定义对象的属性。我也有字典,其中的值将是一些自定义对象的实例。

作为一个例子,可能我这些对象:

  • MySmallObject1,其具有的属性namesize,和value(所有NSStrings
  • MySmallObject2,其具有的属性datecost(一个NSDateNSNumber
  • MyBigObject,其具有性质box1box2(w HICH是MySmallObject1MySmallObject2情况下,分别)
  • theDict,这是具有MyBigObject S作为值的NSDictionary实例

所以,当我建立我的文本框,我实际上可能会下降一棵树,将看是这样的:

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。看起来这是我需要去的方式,但我努力从C世界获得的&*与我在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]; 
} 

globalCounterint我正在递增每次我东西放在tagDict时间,所以我可以保持它的独特。我想在这种情况下,我可能只是简单地使用NSArray,它会工作得很好,并可能看起来更清洁。我的计划是在我的testFieldDidEndEditing喜欢用tagDict

- (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世界中如何工作仍然有点模糊,我认为我还没有完全理解。

+0

添加抽象层 - 如何使用字典将所有内容映射到一起? – Till

+0

@Till:我编辑了一些关于我的模型的更多细节。我认为在这种情况下字典不起作用,因为我无法将整棵树存储为'key',对吗? – GeneralMike

+0

我只能看到两种基本方法:1.使用标签,2.在数据模型中使用指向视图的实例指针。在大多数情况下,肯定是丑陋和纯粹的错误。因此,让我们稍微检查1 ...该标记可能是您模型的生成值。假设MySmallObject1在被询问时呈现一个唯一的值(我们称之为Object-ID)。现在建立一个哈希映射(aka字典),将ID链接回控制器中的对象 - 这是否有意义? – Till

回答

0

我最终做了很多我认为@Till试图建议的事情。我向我的视图控制器添加了NSMutableArray *tieArrayint tieCounter作为@properties。我从我的OP的第一个代码块构建UITextFields代码现在:

for (NSString *key in [theDict allKeys]) 
{ 
    UITextField *txt = [[UITextField alloc] initWithFrame:...]; 
    txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name]; 
    [self.view addSubview:txt]; 

    txt.tag = self.tieCounter; 
    self.tieCounter ++; 
    [self.tieArray addObject:[[(MyBigObject *)[theDict objectForKey:key] box1] name]]; 
} 

然后在我的textFieldDidEndEditing

- (void) textFieldDidEndEditing:(UITextField *)textField 
{ 
    if ([tieArray objectAtIndex:textField.tag] isKindOfClass:[NSMutableString class]]) 
    { 
     [(NSMutableString *)[tieArray objectAtIndex:textField.tag] setString:textField.text]; 
    } 
    else if (//...More conditions to set other variable types with the syntax as needed) 
} 

需要注意的是这个工作的MySmallObject1MySmallObject2需要的所有属性由isKindOfClass:检查覆盖,实际的语法会有所不同,取决于该属性是什么类。

我还没有能够测试这一点(和我的应用程序可能不会处于可测试状态很长一段时间),但它对我来说是有意义的,它不会抛出任何错误或警告。如果我在运行时遇到问题,我会在这里更新。

0

您可以使用UITextField+blocks它可能不太纠缠。如果对象具有相似的接口或者使用像setText:这样的方法实现一个协议,则会更容易。

+0

有没有这个文件?我不习惯使用块,所以我不确定我应该怎么做,这将帮助我。 – GeneralMike

0

你可以使用原始的方法与.tag,但使用typedefs。

typedef enum TFTypes { 
    TFModalType1, 
    TFModalType2, 
    TFModalType3, 
    TFModalType4, 
    TFModalType5, 
    ... 
} TFType; 
+0

使用typedefs将有助于使标签感觉不那么随意,但我不认为这将有助于我将数据存储在对象中的方式,这与我在编辑OP中描述的方式相同。 – GeneralMike

相关问题