我越来越多地看到术语"绑定"和"活动绑定",特别是在像Ember.js,Can.js,Knockout.js和Backbone.js这样的JavaScript框架中,更传统的是,在Cocoa和Objective中-C,并想知道什么是绑定?(究竟什么是"活动绑定"?).
似乎从松散的意义上说,我们可以"绑定A到B",然后我们可以说,"A绑定到B",这意味着B中的更改将自动反映在A中 - 无需用户担心必须设置一个观察者,但观察者会自动设置,并在B更改时自动通知.
当我们这样做时,我们正在创造一种"约束力".
从更严格的意义上说,似乎Cocoa和Objective-C定义它是这样的:绑定是对象A 的属性 foo,并且此属性观察并更改为bar对象B 的属性值.如何发生,我们不要小心,它应该被隐藏(如黑盒子),通常它是由观察者模式实现的.所以"绑定"这个词实际上意味着一个"属性",而不是一个动作 - 这个属性观察并变为与其他属性相同的值.
此绑定不仅限于绑定到数据的UI元素.它可以是包含较小UI元素的外部较大UI元素,外部UI元素具有绑定到内部UI元素属性的属性.或者它可以是绑定到另一个非UI数据属性的一个非UI数据属性.
这到底是什么绑定吗?那么活动绑定呢?
我正在努力改进我的KVC/KVO/Cocoa-Bindings-fu,并想知道继承NSArrayController的原因是什么?
我创建了NSView的子类来将图像绘制为模式:
@interface CePatternView : NSView
{
NSImage* image;
id observableObjectForImage;
NSString* keyPathForImage;
}
@end
Run Code Online (Sandbox Code Playgroud)
我实现了以下内容来公开绑定:
+ (void)initialize
{
// Expose the "image" binding to IB.
[self exposeBinding:@"image"];
}
- (Class)valueClassForBinding:(NSString *)binding
{
if([binding isEqualToString:@"image"])
return [NSImage class];
return nil; // Unknown binding
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,图像绑定不会出现在Interface Builder中.
我是否真的必须创建一个IBPlugin来在Interface Builder中公开绑定?对于我不打算重用的自定义视图来说,这似乎有些过分.
在编写Mac应用程序和使用Cocoa时,我是初学者,所以请原谅我的无知.
我正在寻找创建一个自定义视图,它暴露了一些属性,然后我可以绑定到NSObjectController.由于它是一个自定义视图,Bindings Inspector显然没有列出我添加到视图中的任何属性,然后我可以使用Interface Builder绑定到这些属性.
在转向Stackoverflow/Google寻求帮助之后,我偶然发现了几个可能的解决方案,但似乎两者都不适合我的情况.第一个建议创建一个IBPlugin,这意味着我的绑定将在Bindings Inspector中提供.然后,我可以使用IB将视图绑定到控制器.显然,Xcode 4不支持IBPlugins,所以一个人不在窗外.我也假设(可能是错误地)不再支持IBPlugins,因为这些天有更好的方法来做这些事情?
第二个选项是以编程方式将控制器绑定到视图.我对如何实现这一点感到有点困惑.是否需要子类化NSObjectController,以便我可以添加绑定到视图的调用?我是否需要在视图中添加任何内容以支持此操作?我见过的一些例子说你需要覆盖bind方法,而其他人则说你没有.
另外,我注意到[self exposeBinding:@"bindingName"]初始化程序中有一些示例自定义视图调用.根据我从各种来源收集的内容,这与IBPlugins有关,如果我不使用它,我不需要这样做.那是对的吗?
我在这里找到了一篇关于Stackoverflow的帖子,似乎讨论了与我的问题非常相似的内容,但对于最佳答案没有任何明确的赢家.noa在9月12日的最后评论似乎很有趣,尽管他们提到你应该打电话exposeBinding:.这条评论是否正确?是否真的需要对exposeBinding进行调用?
为任何愚蠢的问题道歉.任何帮助非常感谢.
我想将NSButton的启用状态绑定到NSArrayController是否包含任何选定项.
我该怎么做呢?
虽然我搜索了很多关于Cocoa Bindings的信息,但我仍然对我所获得的信息相对不满意.似乎这个话题对许多人来说有点麻烦,很多人只是避免这种模式,我认为不应该这样.
当然,看起来绑定有时候太复杂,或者设计的开销太大......
但是,我有一个非常直接和具体的问题:如果我可以直接建立绑定,为什么需要NSObjectController?
例如,代码:
[controller bind:@"contentObject" toObject:self withKeyPath:@"numberOfPieSlices" options:nil];
[slicesTextField bind:@"value" toObject:controller withKeyPath:@"content" options:nil];
[stepperControl bind:@"value" toObject:controller withKeyPath:@"content" options:nil];
Run Code Online (Sandbox Code Playgroud)
完全相同:
[slicesTextField bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil];
[stepperControl bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil];
Run Code Online (Sandbox Code Playgroud)
在我的例子中,我们讨论的是类的属性,其中发生了一切,所以我猜测NSObjectController的需要是:
控制器的关键路径是对象,其他控件的绑定需要它的属性,而不是它的值,就像它们的原语和它们周围的包装一样(在我的情况下,numberOfPiesSlices是NSInteger)
或者当需要从其他外部对象进行绑定时,不仅要在一个对象内进行绑定
任何人都可以确认或拒绝这个吗?
我有一个使用故事板的基于Mac文档的核心数据应用程序.故事板具有以下布局:
Window Controller
Split View Controller
Table View Controller
Text View Controller
Run Code Online (Sandbox Code Playgroud)
My Core Data模型包含一个Chapter实体,它包含两个属性:title和contents.我希望表视图显示每个章节标题.文本视图显示所选章节的内容.
如果我使用的是xib文件,我会在xib文件中添加一个数组控制器.我将数组控制器绑定到File的所有者以访问我的NSPersistentDocument子类.我将表视图绑定到数组控制器的arrangeObjects属性,并将文本视图绑定到数组控制器的选择.
但随着故事板,事情变得更加复杂.我可以向表视图控制器添加一个数组控制器,将表视图绑定到数组控制器,并在表视图中显示章节标题.但是文本视图控制器无法绑定到该阵列控制器,因为阵列控制器位于另一个场景中.
如何在Interface Builder中添加数组控制器,以便表视图控制器和文本视图控制器都可以访问它并绑定到它?
在Xcode去为OS X应用程序添加Storyboard之前,您可以通过将数组控制器绑定Managed Object Context到File's Owner一个Model Key Pathof 来将数组控制器连接到文档的托管对象上下文managedObjectContext.有了故事板,就再也没有了File's Owner,从现在开始你从哪里获得背景?
Apple的文档落后于这个领域,在Xcode中没有任何明显的地方可以绑定.显然,我可以回到非故事板路线并使用旧方法,但必须有一种新方法.
请给我一些关于如何在不使用核心数据的情况下将NSOutlineView与NSTreeController绑定一起使用的链接.
我在OSX上使用Swift中的绑定做一个简单的测试程序.有一个NSTableView,NSArrayController和一个模型类我尝试将它们连接在一起,但没有成功!构建编译但立即给出此错误: 线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0)
代码如下所示:
model class:
import Foundation
class Name {
var firstName = "Brook"
var lastName = "Brooklyn"
}
Run Code Online (Sandbox Code Playgroud)
视图控制器:
import Cocoa
class ViewController: NSViewController {
dynamic var names = [Name]() // serves as the content for Array-Controller
override func viewDidLoad() {
super.viewDidLoad()
// populate array
var name1 = Name()
var name2 = Name()
names.append(name1)
names.append(name2)
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
Run Code Online (Sandbox Code Playgroud)
}
我已经设置了数组控制器来使用我的类"Name"并添加了键"firstName"和"lastName"
这是故事板:

有没有人在Xcode 6 …
cocoa-bindings ×10
cocoa ×6
binding ×2
objective-c ×2
backbone.js ×1
button ×1
core-data ×1
data-binding ×1
ember.js ×1
ibplugin ×1
macos ×1
nsview ×1
osx-yosemite ×1
state ×1
subclass ×1
swift ×1
xcode ×1
xcode4 ×1
xcode6 ×1