我需要在NSBrowser中使用当前选定的路径更新NSPathControl,但是当路径从NSBrowser更改时,我无法找到获取通知的方法.执行此操作的理想方法是观察NSBrowser中的路径键路径,但这使得KVO只能观察<key>返回void消息且没有更新的set 方法(setPath返回bool成功值).
我也试过观察selectedCell密钥路径,但是当选择更改时我没有收到通知.
有没有其他一些非常明显的方法可以做到这一点,我错过了?
已经开始使用Core Data了,虽然我已经想出如何在常规的Cocoa应用程序中使用它,但它似乎在Cocoa Touch中有所不同.如何将实体绑定到Cocoa Touch中的表格单元格等对象?
cocoa cocoa-touch core-data nsarraycontroller cocoa-bindings
在Aaron Hillegass的" Mac OS X可可编程"第9章"插入时开始编辑"一节中,他解释了如何做到这一点.这让我感到困惑,虽然事情是,他做了一堆其他的东西.这是完整的代码清单:
- (IBAction)createEmployee:(id)sender
{
NSWindow *w = [tableView window];
// Try to end any editing that is taking place
BOOL editingEnded = [w makeFirstResponder:w];
if (!editingEnded) {
NSLog(@"Unable to end editing");
return;
}
NSUndoManager *undo = [self undoManager];
// Has an edit occurred already in this event?
if ([undo groupingLevel]) {
// Close the last group
[undo endUndoGrouping];
// Open a new group
[undo beginUndoGrouping];
}
// Create the object
Person *p = …Run Code Online (Sandbox Code Playgroud) 我目前正在对一个项目进行最后的修改.
很多(如果不是全部)UI逻辑当前依赖于Cocoa Bindings.一些用户界面元素(标签,按钮等)定义了"隐藏"绑定.触发某些事件时,将切换这些元素可见性.
我正在尝试为可见性变化设置动画(通过设置不透明度,甚至可能是缩放比例).这可以通过多种方式轻松完成,可以通过设置相关的图层属性,将动画添加到图层等等.但是,由于我试图完全依赖绑定行为,我"不能"真正做到这直接.
我尝试使用Layer动作实现一个实现,通过定义键kCAOnOrderIn和kCAOnOrderOut相关元素的动作,但它确实不起作用,因为setHidden:它最有可能是触发NSView而不是CALayer- 这是有意义的.
所以,我的问题是:在Cocoa绑定调用setHidden:时,你将如何在NSView上制作动画setHidden:.
谢谢.
cocoa core-animation interface-builder calayer cocoa-bindings
我正在以编程方式更改可可绑定.我将NSTextField的值绑定到ArrayController的选择.手动更改绑定后,我得到"不符合键值的键值编码"错误,键是旧键,而不是新键.
看看代码:
NSTextField *textField = [self listTextField];
NSDictionary *currentBindInfo = [textFieldTableViewCell infoForBinding:NSValueBinding];
NSLog(@"pre-change bindings for textField: %@", currentBindInfo);
/* Change the binding. [Tried unbind: first, no difference] */
[textField bind:NSValueBinding
toObject:[currentBindInfo valueForKey:NSObservedObjectKey]
withKeyPath:@"objectValue.iLifeProductName"
options:[currentBindInfo valueForKey:NSOptionsKey]];
/* Log the info so we can confirm it changed. debugging. */
NSLog(@"post-change bindings for textField: %@", [textFieldTableViewCell infoForBinding:NSValueBinding]);
Run Code Online (Sandbox Code Playgroud)
要进行故障排除,我在更改之前和之后调用'infoForBinding',它看起来要正确更改.我可以看到旧值,然后我调用bind:toObject ...并再次转储infoForBinding,并且绑定的值已更改:
2011-07-06 22:36:23.137 My App 2011[14640:407] pre-change bindings for listTextFieldTableViewCell: {
NSObservedKeyPath = "selection.osxProductName";
NSObservedObject = "...sameTextField... 0x4009cc380>";
NSOptions = {...same... };
}
2011-07-06 22:36:23.138 …Run Code Online (Sandbox Code Playgroud) 如何将NSDictionary对象绑定到Interface Builder中的多个文本字段?
我想将每个对象绑定到字典中的特定项.例如,第一个文本字段应绑定到Actor:

cocoa nsdictionary interface-builder nsuserdefaults cocoa-bindings
我想将a的boolean enabled属性绑定NSTextField到一个状态NSButton.我已经尝试添加自定义NSValueTransformer的是变换的状态NSButton进入NSNumber.但是,在该场景中,由于某种原因,文本字段始终处于禁用状态.我的第二种方法:由于NSValueTransformer不提供返回原语类型,因此也会失败BOOL.
示例:
屏幕截图显示了禁用文本字段的示例,因为复选框具有状态NSOnState.我也想将标签绑定到这个状态.

此外,如果我可以在Interface Builder中设置"禁用文本",那将会很方便.在上面的例子中,我在关联的类中设置了文本.
编辑:
我将帐户文本字段的enabled属性设置self.anonymousLoginCheckbox.state为Model Key Path.类似于密码文本字段.但是,它并没有正常工作.

更新:
在使用IB,NSObjectController子类和绑定时,我一直在努力理解插入控制器逻辑的最佳方法.
我需要在模型和视图之间插入控制器逻辑,我很难找到一种优雅的方法.是的,您可以将操作发送给文件所有者并处理其中的控制器逻辑,但是当某些核心数据模型可以扩展到具有深层关系结构的50个实体或更多实体时,这将开始加载到令人难以置信的锅炉板代码量.
一个非常简单的例子是这样的; 想象你有一个具有四个字符串属性的实体myTextWinter,myTextSpring,myTextSummer,myTextAutumn.你有一个通过NSObjectController连接到IB的视图.现在,假设用户可以通过选择菜单中的春,夏,秋,冬来选择他们希望查看的"季节" - 当选择该季节时,我想显示适当的季节文本.
在这个简化的例子中,我可以获取NSDocument子类中的对象,创建一个名为mySeasonText的属性,我在视图中绑定它,然后检查我的NSUserDefaults以获取适当的季节并将请求路由到模型中的相应属性.
问题来自于我有50个实体,有些实体有两个,三个或更多的关系,每个实体都有自己的季节特定文本属性集,我希望在从Season菜单中选择时切换.或者如果我将一堆nsarray控制器链接在一起以访问更深层次的对象.
到目前为止,我一直在做以下事情; 在我的每个模型对象中添加一个名为'mySeasonText'的属性,然后从我的控制器设置中获取设置,并路由到适当的季节.每当选择菜单中的新项目时,我都会刷新这些对象.
虽然这有效并消除了绝对大量的样板代码,但我的控制器逻辑现在已经在我的模型中了.
肯定有更好的办法!有人可以指点我正确的方向吗?
cocoa core-data objective-c interface-builder cocoa-bindings
我正在使用Cocoa绑定(如在Mac上的Objective-C中)使用值转换器显示相对日期值.也就是说,我的NSValueTransformer子类将NSDate实例转换NSString为显示相对日期,如"3秒前","2分钟前"等.
如您所见,这些显示的值随着时间的推移而过时,因此需要以某种方式刷新.我知道我需要使用计时器,然后强制更新绑定,以便重新执行值转换器并显示正确的相对日期.
但问题是,如何使这些绑定刷新其值?
我正在构建一个使用核心数据,NSDocument,故事板和Cocoa绑定的OS X应用程序.
我的期望是发生以下情况:
创建MyDocument(NSDocument子类)的实例.
MyDocument创建NSManagedObjectContext表示文档数据的核心数据.
MyDocumentNSWindowController通过其标识符从故事板中实例化一个.
在故事板中,窗口控制器包含DocumentEditorViewController(NSViewController子类),用于显示和编辑文档.
在故事板中,DocumentEditorViewController有一个NSArrayController绑定到MyDocument托管对象上下文.
在故事板中,DocumentEditorViewController有一个绑定到的表视图NSArrayController.
这样,UI中的任何更改都可以使用它NSManagedObjectContext,而无需任何粘合代码.
我希望这是直截了当的,因为我相信我正按照预期的方式使用这些技术.但是我无法使绑定工作,特别是在第5步和第6步.我发现的所有项目模板和示例项目都不使用Core Data,不使用故事板,或者不使用NSDocuments.
应该绑定哪些对象?NSArrayController的类,键和密钥路径应该是什么?
回答这个问题的另一种方法是指出一个使用所有这些技术的工作示例项目.
cocoa-bindings ×10
cocoa ×9
objective-c ×4
core-data ×3
appkit ×1
calayer ×1
cocoa-touch ×1
macos ×1
nsdictionary ×1
nsdocument ×1
nstextfield ×1
state ×1
xcode ×1