标签: cocoa-bindings

"控制器密钥"在Interface Builder> Inspector> Bindings中的含义是什么?

我无法在文档中找到他们解释所有这些领域及其含义的内容.特别是"控制器键"对我来说并不清楚.

cocoa interface-builder key-value-observing key-value-coding cocoa-bindings

5
推荐指数
2
解决办法
5366
查看次数

在数组控制器上使用谓词来过滤相关对象

我有一个使用Core Data和绑定的应用程序.我希望有一个NSSearchField可以搜索绑定到NSTableView的NSArrayController.阵列控制器包含具有"名称"字段的Core Data对象.我已经像这样设置了NSSearchField:

Bind To: the array controller
Controller Key: filterPredicate
Predicate Format: name contains[c] $value
Run Code Online (Sandbox Code Playgroud)

这有效.我想扩展它,以便它可以搜索与数组控制器中的对象相关的对象的字段.数组控制器中的每个对象与另一种称为"tag"的对象具有to-many关系,该对象具有名为"name"的字段.我尝试了以下方法:

Bind To: the array controller
Controller Key: filterPredicate
Model Key Path: tags
Predicate Format: name contains[c] $value
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用.当文本输入NSSearchField时,NSTableView中没有任何事情发生.这有什么问题?

cocoa core-data objective-c cocoa-bindings

5
推荐指数
1
解决办法
7998
查看次数

用于在Cocoa中调试KVO/Bindings的工具

是否有任何工具来记录给定对象的当前观察者,本着"gdb info gc-roots"的精神?我发现"gdb info gc-references"可以做到这一点(某种程度上)作为其原始目的的副产品,但这不适用于非垃圾收集的应用程序.谢谢!

objective-c key-value-observing cocoa-bindings

5
推荐指数
1
解决办法
942
查看次数

NSArrayController和KVO

在调用更新底层数组的方法时,如何更新绑定到NSArrayController的tableView需要做什么?一个例子可能会澄清这一点.

当我的应用程序启动时,它会创建一个SubwayTrain.当SubwayTrain初始化时,它会创建一个SubwayCar.SubwayCar有一个可变的阵列'乘客'.当地铁车辆初始化时,乘客阵列被创建,并且放入几个人物对象(假设有一个名为"票务收集者"的人和另一个名为"无家可归者"的人).这些人总是在SubwayCar上,所以我在初始化时创建它们并将它们添加到乘客阵列.

在应用程序的生命周期中,人们登上了汽车.在SubwayCar上调用'addPassenger',并将此人作为参数传入.

我有一个NSArrayController绑定到subwayTrain.subwayCar.passengers,并在启动时我的收票员和无家可归的人显示正常.但是当我使用[subwayCar addPassenger:]时,tableView不会更新.我已经确认乘客肯定被添加到阵列中,但是在gui中没有任何更新.

我可能做错了什么?我的直觉是它与KVO相关 - 当调用addPassenger时,阵列控制器不知道更新(即使addPassenger调用[passenger addObject:].我在这里可能会出错 - 如果有帮助我可以发布代码).

感谢愿意帮忙的人.

UPDATE

所以,事实证明我可以通过改变addPassenger方法来实现这一点

[seatedPlayers addObject:person];
Run Code Online (Sandbox Code Playgroud)

NSMutableSet *newSeatedPlayers = [NSMutableSet setWithSet:seatedPlayers];

[newSeatedPlayers addObject:sp];

[seatedPlayers release];

[self setSeatedPlayers:newSeatedPlayers];
Run Code Online (Sandbox Code Playgroud)

我想这是因为我正在使用[self setSeatedPlayers].这是正确的方法吗?复制数组,释放旧数组并更新副本(而不是仅添加到现有数组)似乎非常麻烦.

cocoa key-value-observing nsarraycontroller cocoa-bindings

5
推荐指数
2
解决办法
2930
查看次数

如何在两个nib文件之间共享NSArrayController?

我有一个图像数组和两个nib文件.一个nib文件有一个窗口,在NSTableView中显示图像.另一个笔尖有一个窗口,可以将图像数组绘制到NSView中,还可以在所选图像上绘制一个突出显示.

图像数组由NSArrayController控制.我无法让两个笔尖共享NSArrayController.我会有两个单独的NSArrayControllers绑定到相同的内容,但我也希望两个笔尖共享控制器的选择; 也就是说,如果在表格窗口中选择图像,它也会在另一个窗口中被选中.

有没有标准的方法来做到这一点?

cocoa objective-c nsarraycontroller cocoa-bindings

5
推荐指数
1
解决办法
1644
查看次数

Cocoa NSTextField拖放需要子类......真的吗?

直到今天,我还没有机会使用除NSWindow之外的任何东西作为NSDraggingDestination.当使用窗口作为一个通用的拖拽目的地时,NSWindow会将这些消息传递给它的委托,允许你处理drop而不用子类化NSWindow.

文件说:

尽管NSDraggingDestination被声明为非正式协议,但您创建的NSWindow和NSView子类只需要实现那些相关的方法.(NSWindow和NSView类为所有方法提供私有实现.)窗口对象或其委托可以实现这些方法; 但是,如果两个地方都有实现,则委托的实现优先.

今天,我有一个带有两个NSTextFields的窗口,我希望它们具有不同的放置行为,我不想在窗口中的任何其他位置允许放置.我解释文档的方式,似乎我要么必须子类化NSTextField,要么在窗口的委托上创建一些巨大的意大利面条件下拉处理程序,它们针对每个视图点击检查draggingLocation,以便选择不同的drop-area行为.每个领域.

基于NSWindow-delegate的集中式丢弃处理程序方法似乎在任何情况下都是繁重的,在这种情况下,您只有少量的drop目标视图.同样,无论情况如何,子类化方法似乎都很繁琐,因为现在丢弃处理代码存在于视图类中,因此一旦接受了丢弃,您就必须想出一些方法来将丢弃的数据封送回模型.该绑定文档提醒你关闭试图通过编程设置UI价值驱动绑定.所以现在你也被困在那里.

所以我的问题是:"真的!?那些是唯一随时可用的选择吗?或者我在这里错过了一些直截了当的东西?"

谢谢.

cocoa drag-and-drop nsview cocoa-bindings

5
推荐指数
1
解决办法
1879
查看次数

使用NSTreeController,NSArrayController和Core Data创建主从细节应用程序

我来自iOS并尝试构建最简单的主 - 细节OS X应用程序,但我很难过渡.更具体地说,我无法理解如何使用NSArrayController将Core Data与NSTableView集成;

该应用目前看起来像这样: 联系人应用

我的数据模型如下所示:

在此输入图像描述

你可以看到它非常简单.我希望能够在左侧的源列表中选择一个组,然后在右侧的表视图中显示所有包含人员的组.

我已经设法将NSOutlineView连接到一个简单的NSArray,但是使用NSTreeController将它连接到所有Group对象的最佳方法是什么,并使其全部可编辑?

macos cocoa core-data objective-c cocoa-bindings

5
推荐指数
1
解决办法
3232
查看次数

使用Cocoa绑定,以编程方式更改NSTextField的值不会更新模型

我有一个NSTextField绑定到我的模型.如果以编程方式更改文本字段的内容,则不会更新模型.我知道你应该更新模型.

但是我正在尝试实现一个NSTextField子类,它可以在鼠标悬停在它上面时识别滚动以更改它的数值.显然我无法从这个子类访问该模型.所以你有什么建议我怎么做?

解决方案(感谢noa):

- (void)scrollWheel:(NSEvent *)theEvent {
    [self setFloatValue:[self floatValue] - [theEvent deltaY]];
    NSDictionary *bindingInfo = [self infoForBinding: NSValueBinding];
    NSObject *boundObject = [bindingInfo valueForKey:NSObservedObjectKey];
    NSString *keyPath = [bindingInfo valueForKey:NSObservedKeyPathKey];
    [boundObject setValue:[NSNumber numberWithFloat:[self floatValue]]
               forKeyPath:keyPath];
}
Run Code Online (Sandbox Code Playgroud)

xcode cocoa objective-c nstextfield cocoa-bindings

5
推荐指数
1
解决办法
3659
查看次数

如何在使用绑定时从基于NSTableView的NSTableCellView中触发操作

我在10.8上运行基于视图的NSTableView时遇到问题(目标是10.7,但我认为这不相关).

我正在使用NSTableView,我通过绑定获取自定义NSTableCellView的内容值.我使用NSTableCellView的obejctValue来获取我的数据.

我在单元格中添加了一个按钮,我希望它在单击时触发一些动作.到目前为止,我只能在自定义NSTableCellView的子类中触发一个动作.

我可以使用链获得这样点击的行:

NSButton *myButton = (NSButton*)sender;    

NSTableView *myView = (NSTableView*)myButton.superview.superview.superview;

NSInteger rowClicked = [myView rowForView:myButton.superview];
Run Code Online (Sandbox Code Playgroud)

从那里我不知道如何到达定义了操作的App Delegate或控制器.

当我使用cocoa绑定时,我没有NSTableView上的委托,我可以使用它来触发我的操作.

你知道我怎么能和控制器交谈吗?

提前谢谢了!

nstableview cocoa-bindings nstablecellview

5
推荐指数
1
解决办法
3436
查看次数

我应该在windowController的dealloc中取消绑定cocoa绑定吗?

我有使用核心数据绑定的窗口控制器和视图控制器,但我希望能够真正获得这些视图,真正取消分配.然后我想要resetmanagedObjectContext,并且在那时放弃了尽可能多的内存.

我发现我需要unbind在Nib中绑定的东西,或者MOC保留Nib对象.

问题是这个EXEC_BAD_ACCESS跟踪:

在此输入图像描述

如果我没有取消绑定所有绑定,即使是在Interface Builder reset上创建的那些绑定,也会导致EXEC_BAD_ACCESS,因为绑定试图通过应该消失的数组控制器反映视图中MOC的变化,但不是"T.

所以我在窗口控制器的dealloc中做了这个:

- (void) dealloc 
{
    NSLog(@"Wincon dealloc");
    @autoreleasepool {
        // Remove subview to ensure subview dealloc
        [_viewController.view removeFromSuperviewWithoutNeedingDisplay];

        // Tear down bindings to ensure MOC can reset
        for (NSObject<NSKeyValueBindingCreation>* object in
             @[_watcherAC, _watchersTimesTreeController, _watcherTableView, _itemsOutlineView])
        {
            for (NSString* binding in [object exposedBindings])
                [object unbind:binding];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以这种方式触发:

- (void) switchToBackgroundMode
{
    NSLog(@"SwitchToBackgroundMode");

    // Hide the menu and dock icon
    [NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory];

    // Force every view to deallocate before …
Run Code Online (Sandbox Code Playgroud)

macos core-data objective-c cocoa-bindings automatic-ref-counting

5
推荐指数
0
解决办法
975
查看次数