【问题标题】:How to bind textfields to attributes of one core data entity containing one row?如何将文本字段绑定到包含一行的一个核心数据实体的属性?
【发布时间】:2011-09-06 02:56:20
【问题描述】:

我有一个视图想要显示我的应用的汇总使用数据。方便的是,我有一个可可核心数据实体,其中预先汇总了所有使用数据(因此它只有一行)。我想将实体中的每个单独属性绑定到不同的 NSTextFields(例如不在 NSTableView 中)。

这似乎不是核心数据+界面构建器很好处理的使用模式。到目前为止,我正在做的是将我的聚合属性复制到 NSUserDefaults 并将我的文本字段绑定到默认值。我想要一种更好、更优雅的方式来做到这一点。

还有更好的想法吗?我需要用一个大胖子的线索打我的头吗?

一如既往地感谢您的阅读...

【问题讨论】:

  • 你看过苹果提供的Recipes核心数据示例程序了吗?
  • 不,我没有。我假设您的意思是 this -- 会检查一下
  • 现在我已经看过了,但它并没有抓到这种特别的痒。
  • 啊,我想我记得在那里看到过类似的东西。
  • 数据绑定示例做了我见过的所有绑定示例所做的事情——通过 nsarraycontroller 将所有数据绑定到一个表。 (然后字段被绑定到数组中的选定对象。)所以另一种方法是在对话框上隐藏一个表....hack hack hacky...

标签: objective-c cocoa core-data interface-builder cocoa-bindings


【解决方案1】:

好吧,我只是用自己的大胖子线索打了自己的头。 解决方案是使用 NSObjectController。

  1. 将 NSObjectController 的实例作为 IBOutlet 添加到 NSWindowController 实现中。
  2. 将 NSObjectController 添加到对话框的 xib 并将字段绑定到它。
  3. 将视图/窗口控制器(文件所有者)中的 NSObjectController 链接到 xib 中的 NSObjectController。
  4. 实现控制器的 windowDidLoad。

在我的情况下,它在标题中看起来像这样:

NSObjectController *dataCtrl;
...
@property (nonatomic, retain) IBOutlet NSObjectController *dataCtrl;

在实现中像这样

    @synthesize dataCtrl;
    ...
    - (void)windowDidLoad
    {
        NSManagedObject *totals = [StatsSupport getTotalRecord];
        [[self dataCtrl] setContent:totals];   // where the rubber meets the road
        [super windowDidLoad];
    }

当然,+[StatsSupport getTotalRecord] 是您的基本核心数据获取类型代码,如果您读到这里,您就会知道它的外观。 (它可能已经存在,因为您需要此代码或类似的代码来执行正常的数据读取/更新)

最后跳一段快乐的舞蹈,因为你让可可为你做了一些工作。

【讨论】:

    【解决方案2】:
    -(void)updateFields {
      // fetch the row from the persistent store into your custom object
      // then get a reference to the data in your object, e.g.
      MyDataObject *data = [resultsArray objectAtIndex:0];
    
      myTextField1.text = [NSString stringWithFormat:@"%d", [data.anIntegerValue intValue]];
      myTextField2.text = data.aTextValue; 
      // etc...
    }
    

    【讨论】:

    • 我猜优雅是指没有代码或几乎没有代码。我现在正在做的是关于这么多代码(将我的数据复制到用户默认值中)。我正在尝试实现绑定的极少代码潜力。
    • 总的来说,Objective C 是一种相当“冗长”的语言。我有点习惯了。我认为这是有意的,它确实使阅读代码更容易。
    • 是的,确实很冗长——在类中声明,“@property”+“@synthesize”。我对此很好。 Interface Builder 是一个可用 gui 工具,我想尽可能多地利用它......因此这篇看似不切实际的 SO 帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多