问题标签 [cocoa-bindings]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cocoa - 在 Cocoa 中实现 KVO/Bindings-Compliant 桥接模式
我正在尝试在可可中实现一个简单的对象桥,其中桥对象充当某个任意其他 NSObject 实例的 kvo/bindings-compliant 下降。
这是我的问题(下面的代码中有更多详细信息):
桥接对象充当 Person-Object 的一个插入点,具有一个名为name的 NSString* 属性和一个 Address* 属性address。绑定到 Bridge 的 keyPath“名称”或“地址”效果很好。当将某个对象绑定到桥的 keyPath“address.street”并且为 Person 的address属性设置了一个新的 Address-Object 时,麻烦就开始了。这会导致与 KVO 相关的异常如下所示:
Cannot remove an observer <NSKeyValueObservance 0x126b00> for the key path "street" from <Address 0x12f1d0> because it is not registered as an observer
即使网桥注意到“地址”属性的变化并发出 willChangeValueForKeyPath/didChangeValueForKeyPath 元组,也会发生这种情况。
下面的代码产生了问题。它是自包含的 Objective-C 代码,可以保存在文件“BridgeDemo.m”中并编译运行
如果你知道这个问题的解决方案,或者可以为我提供更好的方法来解决同样的问题,那么你会让我成为一个非常快乐的程序员!
BridgeDemo.m:
cocoa - 从共享实用程序窗口和最前面的文档窗口绑定的好方法是什么?
我有一个允许打开多个 NSDocument 的应用程序。在这个应用程序中是一个单一的实用程序窗口,其中包含一些我想应用于最前面的文档的功能。
我在这里尝试使用绑定,所以诀窍是如何将实用程序窗口的用户界面干净地绑定到最前面的文档。目标是切换最前面的文档窗口将更新实用程序窗口中的视图;当文档模型的状态发生变化时,绑定到最前面文档模型属性的控件将被适当地更新,等等。
对于从这样的窗口发送动作,很容易只使用第一响应者;文档对象可以通过响应者链拦截动作。但我想要的不止这些,当然你不能绑定到第一响应者。
我有几个想法:
- 在我的笔尖中为共享窗口放置一个对象控制器。当文档窗口更改最前面的状态时,更改该绑定的内容。这样做的一个缺点是,如果我有另一种实用程序窗口,我必须记住将文档窗口的绑定也连接到该实用程序窗口!
- 在应用程序委托中创建一个访问器,通过遍历窗口列表来获取最前面的文档窗口。我的实用程序窗口将通过应用程序委托的方法进行绑定。这里的一个缺点是它不符合 KVO
- 在应用程序委托中有一个 getter 和 setter 来确定(并且可能设置为与 KVO 兼容?这有意义吗?)最前面的文档。当窗口失去主状态时,也许使用窗口通知将 ivar 设置为适当的值。更新:我现在正在使用它,它实际上看起来很干净。我从我的文档窗口的windowDidBecomeMain通知中设置值并在windowWillClose中清除它(如果它是当前值)。除非有任何重大反对意见,否则这可能是我将使用的方法。
- 一个想法是绑定到 mainWindow.windowController.document ......这很接近,除了当我的共享窗口变为主窗口时,这个绑定就消失了。所以我真的需要找到最前面的文档窗口的控制器(以及正确的类)。
这些似乎都不对。有没有更好的方法来做到这一点,我错过了?
cocoa - 可可绑定问题;绑定表列不显示任何数据,控制台中没有错误
我在将 Cocoa 项目从手动同步的接口模型转换为绑定模型时遇到了麻烦,因此我不必担心接口胶水代码。
我遵循了 CocoaDevCentral Cocoa Bindings 教程,以确保我已经涵盖了所有基础,但事情并没有正常工作。我有一个主从界面,但我什至无法让界面的主部分正常工作。主列中没有显示任何数据,即使我已经设置了类似于教程中显示的绑定模型。我已经确保我所有的控制器和对象都有-(id)key
并且-(void)setKey:(id)key
方法,以便它们与绑定兼容,我在我的 nib 中创建了一个 ControllerAlias 对象,将其连接到我的控制器,创建了一个 NSArrayController 绑定到 ControllerAlias 连接到的类中的 NSMutableArrays 之一,确保设置数组中包含的对象类型,然后我将表列绑定到 NSArrayController。
我在控制台中没有收到任何错误,设置NSBindingDebugLogLevel
为 1 也不会产生任何错误,这将帮助我找出问题所在。
为了确保一切正常,我唯一能想到的另一件事是检查连接到 NSArrayController 的 NSMutableArray 中是否确实包含某些内容,并且确实存在。
有什么建议么?我应该检查 Cocoa 绑定还有哪些其他典型的陷阱?
cocoa - 我应该为我的最新项目使用 Cocoa 绑定吗?
我正在启动一个我认为会从绑定中受益的项目(我有一个源列表、几个浏览器视图等),但我认为如果没有它们,它也是非常可行的,也许更容易理解。根据我有限的经验,我发现绑定很难排除故障并且非常“神奇”(例如,很难在任何地方插入日志以找出东西在哪里破坏,一切要么正常,要么不正常)。
这只是我的缺乏经验(在这种情况下,我可以坐下来花一些时间来研究我对绑定的理解,并期望事情开始变得更清晰/更容易)还是我自己编写所有的胶水代码会更好我确信我可以理解和排除故障的方式。
cocoa - 奇怪的绑定问题
我正在尝试使用带有绑定的浏览器视图来表示一些数据,但我收到一条错误消息:
如 NSLog 输出所示,这种情况甚至发生awakeFromNib
在我的应用程序控制器中调用之前,即使我知道 BillingCode 对于 displayString 是 KVC 兼容的。
它似乎与我的树控制器->属性->对象控制器下为“类”设置的值有关,好像我更改了该类的名称,错误消息中的名称也随之变化。awakeFromNib
奇怪的是,据我所知,此时内容数组中不应该有任何对象,因为在被调用之前我不会添加它们。
cocoa - 使用绑定设置 NSBrowserCell 图像?
我有一个 NSBrowser 连接到一个 NSTreeController 绑定到一个 NSTreeNode 对象数组。通过设置 Content 和 Content Value 绑定以正确引用树控制器,很容易使文本部分正常工作,但是如何使用绑定为每个单元格设置图像?
objective-c - 如何使用 NSBrowser 中所选单元格的路径更新 NSPathControl
我需要使用 NSBrowser 中当前选择的路径来更新 NSPathControl,但是当路径从 NSBrowser 发生更改时,我无法找出获取通知的方法。执行此操作的理想方法只是观察 NSBrowser 中的路径键路径,但这使得 KVO 只能观察<key>
返回 void 消息且没有更新的 set 方法(setPath 返回 bool 成功值)。
I also tried observing the selectedCell key path, but I'm not getting notifications when the selection there is changed.
还有其他一些我想念的非常明显的方法吗?
objective-c - MVC 和可可绑定最佳实践问题
假设我有一个视图 myView、一个视图控制器 myViewController 和某种模型对象 myModel。此外,假设模型有两个符合 KVO 的属性,arrayOfPeopleNames
和arrayOfAnimalKinds
(都是 NSStrings)。
在我看来,我希望将两个弹出窗口绑定到这两个数组的内容。
我的问题是,如果 myController 有对 myModel 的引用,并且下拉列表绑定到 myViewController,那么按照以下方式设置 keypath 是一种好习惯myModel.arrayOfPeopleNames
吗?
或者我是否需要在 myViewController 中设置一个额外的 NSArray 来镜像 myModel 中的那个并绑定到该键路径?
从实现的角度来看,前者似乎要简单得多(我不必使控制器数组镜像模型数组),但我想知道它是否将模型暴露给视图。
意见?
objective-c - 是否需要在 NSView 子类中重写 bind:toObject:withKeyPath:options: 来实现绑定?
我有一个 NSView 子类,它具有我想要可绑定的属性。我在子类中实现了以下内容:
我的视图.h:
我的视图.m:
然后,我在以下位置创建与 arrayController 的绑定-[AppController awakeFromNib]
:
这是实现绑定的正确方法吗?它涉及很多样板代码,这让我觉得我做错了什么。
我认为 NSObject 会自动实现我手动完成的操作,-bind:toObject:withKeyPath:options:
但事实并非如此。如果我注释掉我-bind:toObject:withKeyPath:options:
的 setRepresentedObjects 方法,则永远不会被调用。
附加信息:我进行了更多调查并得出结论,我的原始方法是正确的,您确实必须 override -bind:toObject:withKeyPath:options:
。这是 Cocoa Bindings Programming Topics 中的一段话:Bindings 是如何工作的?:
在其 bind:toObject:withKeyPath:options: 方法中,对象必须至少执行以下操作:
- 确定正在设置的绑定
- 使用什么键路径和什么选项记录它绑定到的对象
- 注册为绑定对象的 keypath 的观察者,以便接收更改通知
清单 2 中的代码示例显示了操纵杆的 bind:toObject:withKeyPath:options: 方法的部分实现,该方法仅处理角度绑定。
清单 2 Joystick 类的 bind:toObject:withKeyPath:options 方法的部分实现:
这清楚地表明 Joystick 类(它是一个 NSView 子类)需要覆盖-bind:toObject:withKeyPath:options:
.
我觉得这很令人惊讶。我对这个结论持怀疑态度,因为我没有发现其他代码示例可以做到这一点。然而,正如苹果官方文档所说我应该超越-bind:toObject:withKeyPath:options:
我的结论,这是正确的方法。
如果有人能证明我错了,我会很高兴的!
objective-c - 带有绑定的可编辑 NSTableView 不会在模型中设置值
这是我的设置。
在我的应用程序委托中,我有一个名为 currentFoo 的属性。currentFoo 属性设置为当前选定的 Foo 实例。每个 Foo 实例都有一个名为 results 的 NSMutableArray 属性。结果中的对象可以是各种类型,NSNumber,NSString等......
我有一个在特定时间显示的 NSTableView,它允许用户查看 currentFoo 中的结果集合。还有 UI 允许从结果中添加和删除。
NSTableView 有一个绑定到 NSArrayController 的排列对象控制器键的单列。我编写了一个 NSValueTransformer 子类,该子类在此绑定中用于将结果数组中的各种可能类型转换为我希望在表列中显示的字符串表示形式。
NSArrayController 的内容数组绑定连接到 NSObjectController 的选择控制器键,currentFoo.results 作为模型键路径。最后 NSObjectController 从应用程序委托中获取其内容。
这一切都很好,在 NSTableView 中添加、删除和显示 currentFoo.results 就像我想要的那样工作。
我的问题是当我尝试编辑表格视图的内容时。我已将我的 NSValueTransformer 子类设置为允许反向转换并实现了 reverseTransformedValue:,单步执行代码显示当我编辑 NSTableView 行中的值时,它被正确地发送到我的值转换器的该方法,转换并返回。
然后,当绑定尝试使用反向转换的值更新模型时,就会发生错误:
Cocoa Bindings:对象 0 的键路径设置值错误(来自绑定对象(null)):[ setValue:forUndefinedKey:]:此类与键的键值编码不兼容。
所以基本上有这个数组绑定到表视图,当用户编辑行时,我想将字符串转换回适当的对象。Cocoa bindings 给了我这个错误,这让我相信我需要在 NSTableColumn 绑定的关键路径中设置一些东西,但我不确定是什么。我试过“自我”,但没有奏效。
任何帮助表示赞赏。