ios - 有没有办法自动将 UITextField 绑定(bind)到我的数据模型中的变量?

标签 ios objective-c model-view-controller uitextfield

我正在构建一个 View Controller ,我在其中添加了一堆 UITextField以编程方式对我的看法。我想用我从 CoreData 加载的一些文本预先填充文本字段,但允许用户根据需要进入并更改该文本。然后我需要返回并将新文本再次保存回 CoreData,并使用新值执行计算。保存和加载本身不是问题,但我正在寻找一种跟踪用户更改内容的好方法。

过去,我使用 .tag 完成了此操作。 UITextField 的属性(property)和 textFieldDidEndEditing:委托(delegate)方法。问题是我将在此 View 中包含数十个文本字段 - 足以让我记不清是什么 .tag属于我模型中的什么变量。不得不回去查看我在创建时分配的标签会很痛苦,而且整个事情感觉真的很容易出错。此外,我将在多个不同的循环中创建文本字段,因此在创建时为每个文本字段获取唯一标签将很困难(也许不可能?)。

我正在寻找的是一种在创建模型时将 UITextField 与模型中的变量“绑定(bind)”的方法,并且从那时起就知道,每当用户更新该文本字段时,我在模型中指定的值将立即生效更新以用于将来的计算,并在用户离开屏幕时保存回 CoreData。有没有办法做到这一点?

编辑 1:另一件需要注意的事情是我的模型本身有点复杂。我有几个不同的自定义 NSObject子类都保存着我的数据的不同部分。一些对象具有本身就是其他自定义对象的属性。我也有字典,其中的值将是一些自定义对象的实例。

例如,我可能有这些对象:

  • MySmallObject1 , 具有属性 name , size , 和 value (所有 NSStrings)
  • MySmallObject2 , 具有属性 datecost (一个 NSDate 和一个 NSNumber)
  • MyBigObject , 具有属性 box1box2 (分别是 MySmallObject1MySmallObject2 实例)
  • 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];
    }
    

    哪里globalCounterint每次我往 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/

    相关文章:

    ios - 通过其核心 api 将图像上传到 DropBox 服务器会在 iOS 中出错

    ios - NSPredicate 使用 nsstring 过滤完整的 NSArray 字符串

    objective-c - 如何获取带变量的 NSString?

    ios - 无法删除 NavigatorIOS 右键单击​​操作上的 Realm 对象

    iphone - 运行时更改 Three20 中的语言/本地化

    iphone - 为什么我的表格 View 单元格在使用 reloadRowsAtIndexPaths 重新加载时消失?

    java - Controller 不接受数据 POST 404

    php - CodeIgniter 中的博客 : Where Does the Model start, 和 Controller 端?

    laravel 访问 Blade 中的模型常量

    ios - drawRect - 图像滚动性能