标签: cocoa-bindings

具体到底是什么?

我越来越多地看到术语"绑定"和"活动绑定",特别是在像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数据属性.

这到底是什么绑定吗?那么活动绑定呢?

data-binding binding cocoa-bindings backbone.js ember.js

16
推荐指数
1
解决办法
671
查看次数

子类化NSArrayController的原因是什么?

我正在努力改进我的KVC/KVO/Cocoa-Bindings-fu,并想知道继承NSArrayController的原因是什么?

cocoa subclass nsarraycontroller cocoa-bindings

15
推荐指数
2
解决办法
2628
查看次数

绑定自定义NSView:它是否需要创建IBPlugin?

我创建了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中公开绑定?对于我不打算重用的自定义视图来说,这似乎有些过分.

cocoa interface-builder nsview ibplugin cocoa-bindings

14
推荐指数
2
解决办法
5551
查看次数

如何使用Xcode 4绑定到Cocoa中的自定义视图?

在编写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进行调用?

为任何愚蠢的问题道歉.任何帮助非常感谢.

cocoa objective-c cocoa-bindings xcode4

14
推荐指数
2
解决办法
3929
查看次数

如何将按钮的启用绑定绑定到NSArrayController是否有选择?

我想将NSButton的启用状态绑定到NSArrayController是否包含任何选定项.

我该怎么做呢?

cocoa state button cocoa-bindings

13
推荐指数
2
解决办法
3510
查看次数

我为什么要使用NSObjectController?

虽然我搜索了很多关于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)

  • 或者当需要从其他外部对象进行绑定时,不仅要在一个对象内进行绑定

任何人都可以确认或拒绝这个吗?

macos cocoa binding cocoa-bindings

13
推荐指数
2
解决办法
3100
查看次数

在多个Storyboard场景中使用NSArrayController

我有一个使用故事板的基于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中添加数组控制器,以便表视图控制器和文本视图控制器都可以访问它并绑定到它?

cocoa nsarraycontroller cocoa-bindings

13
推荐指数
1
解决办法
2037
查看次数

将NSArrayController绑定到Core Data文档的托管对象上下文的新方法是什么?

在Xcode去为OS X应用程序添加Storyboard之前,您可以通过将数组控制器绑定Managed Object ContextFile's Owner一个Model Key Pathof 来将数组控制器连接到文档的托管对象上下文managedObjectContext.有了故事板,就再也没有了File's Owner,从现在开始你从哪里获得背景?

Apple的文档落后于这个领域,在Xcode中没有任何明显的地方可以绑定.显然,我可以回到非故事板路线并使用旧方法,但必须有一种新方法.

xcode core-data interface-builder cocoa-bindings

13
推荐指数
2
解决办法
5370
查看次数

NSOutlineView和NSTreeController示例

请给我一些关于如何在不使用核心数据的情况下将NSOutlineViewNSTreeController绑定一起使用的链接.

objective-c nsoutlineview nstreecontroller cocoa-bindings

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

Swift Bindings无法使用Xcode 6 Beta 5

我在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"

这是故事板:

故事板 Bindings1 Bindings2

有没有人在Xcode 6 …

cocoa-bindings swift xcode6 osx-yosemite osx-yosemite-beta

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