标签: cocoa-bindings

从共享实用程序窗口和最前面的文档窗口绑定的好方法是什么?

我有一个应用程序,允许打开多个NSDocuments.在此应用程序中是一个单一的实用程序窗口,其中包含我想要应用于最前面的文档的一些功能.

我试图在这里使用绑定,所以诀窍是如何干净地将实用程序窗口的用户界面绑定到最前面的文档.目标是然后切换最前面的文档窗口将更新实用程序窗口中的视图; 当文档模型中的状态发生变化时,绑定到最前面文档模型属性的控件将被适当更新.

要从这样的窗口发送动作,只需使用第一响应者即可; 文档对象可以通过响应者链拦截动作.但我想要更多,当然你不能绑定第一响应者.

我有一些想法:

  • 在我的nib中为对象窗口放置一个对象控制器.当文档窗口更改最前面的状态时,更改该绑定的内容.这样做的一个缺点是,如果我要使用另一种实用程序窗口,我必须记住将文档窗口中的绑定连接到该实用程序窗口!
  • 在应用程序委托中创建一个访问器,通过遍历窗口列表获取最前面的文档窗口.我的实用程序窗口将通过应用程序委托的方法绑定.这里的缺点是它不符合KVO
  • 在应用程序委托中有一个getter和setter来确定(并且可能设置为KVO兼容?这有意义吗?)最前面的文档.当窗口失去主要状态时,也许使用窗口通知将ivar设置为适当的值.更新:我现在正在使用它,它实际上看起来很干净.我设置为从价值windowDidBecomeMain我的文档窗口的通知,并清除它(如果它是当前值)windowWillClose.除非有任何重大异议,否则这可能是我将使用的方法.
  • 一个想法是绑定到mainWindow.windowController.document ...这很接近,除了当我的共享窗口变为main时,这个绑定就会消失.所以我真的需要找到最前面的文档窗口的控制器(以及正确的类).

这些似乎都不对.有没有更好的方法来做到这一点,我错过了?

cocoa key-value-observing cocoa-bindings

12
推荐指数
1
解决办法
973
查看次数

将有序关系与NSArrayController绑定

如何将NSArrayController的内容绑定到有序多对多关系中的实体?

我的Core Data模型中有一个无序的to-many关系,以及一个NSArrayController,其内容集与父实体的关系绑定.这很好用,可以从NSArrayController访问数据,没问题.

我在开发期间决定允许用户手动重新排序这些子对象,因此我将关系更改为有序关系.现在,当我的笔尖创建我的NSArrayController时,会出现以下错误:

Cannot create NSSet from object Relationship '...' fault on managed object ... of class _NSFaultingMutableOrderedSet
Run Code Online (Sandbox Code Playgroud)

实际上,我认为这一切都是有道理的:这是一个有序的关系,所以现在我得到一个有序的集合.将它绑定到Content Array也是不合适的,因为它现在是NSOrderedSet,而不是数组.我的问题是:现在如何将此关系的数据绑定回NSArrayController?

cocoa core-data nsarraycontroller cocoa-bindings

11
推荐指数
2
解决办法
2478
查看次数

我应该将Cocoa绑定用于我的最新项目吗?

我正在启动一个项目,我认为这将受益于绑定(我有一个源列表表,几个浏览器视图等),但我认为它也是非常可行的,也许更容易理解,没有它们.根据我有限的经验,我发现绑定很难排除故障并且非常"神奇"(例如,很难在任何地方插入日志以确定哪些内容正在破坏,一切都可行或不起作用).

这只是我缺乏经验的谈话(在这种情况下,我可以坐下来花一些时间来完成我对绑定的理解并期望事情开始变得更清晰/更容易)或者我会更好地自己编写所有胶水代码我确信我能理解并排除故障的方式.

cocoa cocoa-bindings

10
推荐指数
3
解决办法
1428
查看次数

Cocoa Core Data新手怎么样

我是伟大的未经洗涤的.NET开发人员之一,他们热衷于尝试Mac OS X开发.目前我正在试图找出Cocoa的各种元素并且在Core Data上有点卡住了.

我注意到Web上可用的大部分文档和资源都涉及广泛的端到端教程,从模型,生成类,基于文档的UI等开始.似乎没有足够的重点放在每个位上,或者至少不是足够的例子.

有人可以指出我正确的方向,无论是在线材料还是书籍,能给我详细的各种指示?也许我陷入了.NET世界,但我仍然在数据访问层等方面思考.我想知道"CRUD"的基础知识,设置持久存储,创建实体,编辑,保存存储等等只是基础知识,没有详细说明用户界面.如果我可以对各个位进行单元测试,那也很好.

我想我正试图在这里进入正确的思维模式 - 那里的任何.NET开发人员都知道适合我们这样看待Cocoa编程的人的阅读材料吗?

非常感谢,Dany.

.net cocoa core-data cocoa-bindings

10
推荐指数
3
解决办法
2928
查看次数

NSPopupButton中的分隔项与绑定

a的内容NSPopupButton绑定到一个NSArray字符串.

我们如何通过绑定插入分隔项?

" -"字符串(如旧版/经典日)不起作用,即字面上显示为" -"菜单项.

有没有标准的Cocoa类和绑定的开箱即用的解决方案?

这应该是一个很重要的问题,但我找不到任何解决办法,不涉及傻黑客就像子类的问题NSMenu,NSPopupButton或者其他非直观的变通.

cocoa objective-c appkit cocoa-bindings nspopupbutton

10
推荐指数
2
解决办法
2757
查看次数

根据计算值为计算值设置KVO

所以我有两个对象,Invoice和InvoiceLineItem.InvoiceLineItem具有一个名为的属性cost,它是基于其他属性动态创建的.为了帮助我使用KVO /绑定:

+ (NSSet *)keyPathsForValuesAffectingCost {
    return [NSSet setWithObjects:@"lineItemType", @"serviceCost", @"hourlyRate", @"timeInSeconds", @"productCost", @"quantityOfProduct", @"mileageCost", @"milesTraveled", nil];
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.当我编辑像serivceCost这样的属性时,表视图中的主要成本更新.

在Invoice对象中,我有一个InvoiceLineItems的NSMutableArray.发票有一个类似的属性叫做totalCost.它是通过迭代订单项来计算的,只要订单项没有标记为已删除(我这样做是为了同步原因),就会增加成本并创建totalCost.

现在我的问题/问题.如何设置Invoice的totalCost,以便在其中一个订单项的费用发生变化时,它可以与KVO /绑定配合使用?

我尝试过设置:

+ (NSSet *)keyPathsForValuesAffectingTotalCost {
    return [NSSet setWithObjects:@"lineItems.cost", nil];
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我最终在控制台中出错:[<NSCFArray 0x1499ff40> addObserver:forKeyPath:options:context:] is not supported. Key path: cost

cocoa key-value-observing cocoa-bindings

9
推荐指数
1
解决办法
2222
查看次数

使用NSArrayController划分NSTableView

我正在尝试创建一个NSTableView使用NSArrayController和可可绑定的分段.我正在寻找类似于NSFetchedResultsControlleriOS 的类似方法,您可以在其中设置部分键路径.我想做类似的东西NSArrayController.

我举个例子:我有不同的任务.每项任务都有三个不同的优先级之一,低,中或高.任务还具有标题,描述,日期等属性.我想按优先级划分或分组任务(此处的部分键路径是优先级).

你可以用绑定来解决这个问题NSArrayController吗?我需要多个NSArrayController还是只需一个?

xcode cocoa nstableview nsarraycontroller cocoa-bindings

9
推荐指数
1
解决办法
4334
查看次数

绑定到NSArrayController的可编辑表视图绑定到NSUserDefaultsController

我有一个Foo代表用户偏好的简单模型,并封装了一个NSString和一个NSNumber.我想Foo在用户默认值中存储一个数组,以便它们在启动应用程序之间保持不变; 我想在表格视图中显示它们,以便用户可以添加,删除和编辑它们.对于这个问题的解决方案看起来非常简单,但事实证明我不可能真正开始工作.

当我的应用程序启动时,我注册了NSUserDefaults一个初始数组的键控存档Foo.在我的XIB中,我有一个数组控制器,其内容数组绑定到共享用户默认控制器的values控制器键; 关键路径foos; "检查内容为复合值"; 并NSKeyedUnarchiveFromData作为价值变换器.然后,表视图又绑定到数组控制器,并将表的列绑定到属性Foo.

Foo从数组中添加和删除时,这非常有效- foos更新用户默认值中的键以反映数组的新内容.问题是,对个人属性的更改Foo不会类似地触发将数组写回用户默认值.我相信这样做的原因是在"讨论的一对多关系 "的键-值观察编程指南中的"注册相关按键"部分:本身被观察到的变化对阵列控制器的阵列,但更改所包含元素的性质不是.

尽管认识到这是一个问题,但我不能为我的生活找出实际做什么才能使这项工作.当我观察到对某个Foo对象的更改时,我需要通知并使用什么消息将整个数组写回用户默认值NSUserDefaults- NSUserDefaultsController,NSArrayController?我希望Apple文档不仅粗略地提到这个问题,并提供了一些实际的示例代码来解决它 - 我已经尝试了一切,我找不到神奇的咒语.

这类似于如何通过NSArrayController获取模型更改的通知,但我不能在他使用自定义视图和使用它之间进行概念上的飞跃bind:toObject:withKeyPath:options:.

谢谢!:)

cocoa objective-c nsuserdefaults nsarraycontroller cocoa-bindings

9
推荐指数
1
解决办法
397
查看次数

以编程方式将列(带有绑定)添加到基于视图的NSTableView?

我有一个简单的应用程序列出了一些模型NSTableView.

该表是一个完全标准的基于视图的表,包含几列,并通过NSArrayController使用绑定进行填充.所有这些都是在Interface Builder中设置的,它可以正常工作.

现在,我想以编程方式添加更多列,并将这些新列绑定到模型中的各种键路径.在那里,我被困住了.

为简单起见,假设此设置:

  1. Model对象是只有一个NSString属性的普通对象: name
  2. AppDelegate有一个NSArray属性(models),它包含许多Model实例.
  3. NSArrayController content绑定到应用程序委托的models数组.
  4. NSTableView content绑定到阵列控制器arrangedObjects.
  5. 表的第一列绑定(在IB中)以显示name属性,即列→表格单元格视图→静态文本表格视图单元格→ 绑定到表格单元格视图的objectValue.name

据我所知,这是直截了当的,并且通过这本书,它就像一个魅力.

但是......如何添加更多列呢?

要以编程方式添加列(为了简单起见,我们只是说这个新列应该只显示name属性,就像已经存在的列一样),我想我会在app delegate中做这样的事情:

NSTableColumn* newColumn = [[NSTableColumn alloc] initWithIdentifier:@"newColumn"];

// do binding magic somehow
// [[newColumn dataCell] bind:NSValueBinding toObject:??? withKeyPath:??? options:nil];

[self.table addColumn:newColumn]; // the table's connected with an IBOutlet
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多从/到数据单元,表,列,数组控制器,数组本身以及各种键路径的绑定组合,但没有任何作用.新列添加得很好,但它从未填充过.

我想我创建的基本NSTableColumn实例是基于单元格的,而不是基于视图的,这会造成麻烦.但是,我不知道如何从这里开始,文档从不谈论以编程方式添加的绑定列.

在这种情况下,我想要的只是一个简单的文本列,绑定到模型,就像我可以轻松设置IB的那样.

我可以通过实现NSTableViewDataSource和"手动"输入表来完成所有这些操作,但我已经完成了其他所有已经设置的绑定.

任何帮助将不胜感激.

cocoa nstableview nstablecolumn cocoa-bindings

9
推荐指数
1
解决办法
4414
查看次数

使用KVO绑定到布尔属性的负数

我正在使用KVO来查看复选框,并根据复选框的状态启用或禁用详细信息输入区域.(即如果选中该复选框,则启用详细信息区域,否则不启用)类似于:

[self.detailInputArea bind:@"enabled" toObject:self withKeyPath:@"enabledCheckbox" options:nil];
Run Code Online (Sandbox Code Playgroud)

我的问题是,现在我想将其更改为设置detailInputAreahidden属性,以显示/隐藏视图,具体取决于复选框的状态.问题是这需要逆逻辑.换句话说,设置enabled,true表示视图已启用(可以接受输入),而false表示不能.但是,使用hidden,true表示视图是隐藏的,否则为false.显然这不起作用,因为当选中复选框时,视图会隐藏自身(其enabled属性为true).

有什么方法可以根据它正在观看的属性的反转来改变这种绑定行为,和/或是否有更好的方法来完成我在这里尝试做的事情?

cocoa key-value-observing cocoa-bindings

9
推荐指数
1
解决办法
1384
查看次数