标签: cocoa-bindings

可可,跨“多对多”关系绑定

我有一个实质上由三个实体组成的模型:制造商<---- >>模型<---- >>汽车

制造商实体具有属性“名称”

模型实体具有属性“名称”

汽车实体具有“注册”和“里程”属性

我有一个表格视图,每行显示汽车登记,里程,型号和制造商,例如,可以轻松绑定:

Bind To: Cars, Controller Key: arrangedObjects, Model Key Path: model.manufaturer.name
Run Code Online (Sandbox Code Playgroud)

我有另一个表格视图,我想在其中显示制造商及其所有汽车的总行驶里程。

所以我将第一列绑定为:

Bind To: Manufacturers, Controller Key: arrangedObjects, Model Key Path: name
Run Code Online (Sandbox Code Playgroud)

然后尝试绑定总里程时,会发生我的问题。我尝试通过以下方式访问它:

Bind To: Manufacturers, Controller Key: arrangedObjects, Model Key Path: models.cars.@sum.milage
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用:(我是用完全错误的方式进行此操作吗?还是需要向我的Manufacturer,Model或Car类中添加一些方法?

非常感谢

编辑:更多信息

奇怪地将一个单独的表绑定到

Model - arrangedObjects - name
Model - arrangedObjects - cars.@sum.milage
Run Code Online (Sandbox Code Playgroud)

可行,尽管日志中仍然抛出错误:不支持[<_NSFaultingMutableSet 0x1dbbb0> addObserver:forKeyPath:options:context:]。关键路径:@ sum.milage

cocoa binding core-data cocoa-bindings kvc

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

如何使 NSTableViewRow 内的按钮响应所表示的对象

我已经和这个问题斗争了一段时间了。我正在开发文件复制管理器模块,到目前为止,除了取消按钮之外,我已经能够使一切正常工作。由于某种原因,当我单击特定行的取消按钮时,按钮操作同时针对多行。

文件复制管理器

经过几天的研究这个问题后,我能够使用以下命令使对象成功取消该行所代表的操作:

-(IBAction)btnCancelOperationClick:(id)sender {
    NSInteger row = [_tableView rowForView:sender];
    if (row != -1) {
        FileCopyOperation *opr = [_fileCopyOperations objectAtIndex:row];
        [opr cancel];
        [_fileCopyOperations removeObjectAtIndex:row];
        [_tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:row] withAnimation:NSTableViewAnimationEffectFade];
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,我可以取消操作并相应地更新我的表。其他一切都按预期工作,但我的代码或绑定一定有问题。我从笔尖加载此单元格,然后使用以下方法注册此笔尖:

[_tableView registerNib:[[NSNib alloc]initWithNibNamed:@"FileCopyCell" bundle:nil] forIdentifier:@"FileCopyCell"];
Run Code Online (Sandbox Code Playgroud)

我将 QueueController 设置为文件的所有者,并像这样挂钩所有内容:

绑定

如果有人能为我指出正确的方向以使这件事正常工作,我将不胜感激。提前致谢!

编辑以添加更多代码示例。

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    FileCopyCell *cell = [tableView makeViewWithIdentifier:@"FileCopyCell" owner:self];
    FileCopyOperation *opr = [_fileCopyOperations objectAtIndex:row];

    [cell.fileName setStringValue:[NSString stringWithFormat:@"Copying \"%@\"",opr.fName]];
    [cell.progressBar setDoubleValue:((opr.bWritten.doubleValue / opr.fSize.doubleValue) * 100)];
    [cell.totalBytes setStringValue:[NSString stringWithFormat:@"of %@",[NSByteCountFormatter stringFromByteCount:opr.fSize.longLongValue countStyle:NSByteCountFormatterCountStyleFile]]];
    [cell.status setStringValue:[NSString stringWithFormat:@"%@",[NSByteCountFormatter stringFromByteCount:opr.bWritten.longLongValue countStyle:NSByteCountFormatterCountStyleFile]]];
    [cell.icon …
Run Code Online (Sandbox Code Playgroud)

cocoa nstableview cocoa-bindings nstablecellview

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

Cocoa绑定到数组控制器中的特定项

是否可以使用NSArrayControllerNSTextField值绑定到数组中的特定项?特别是,我想绑定到数组中第一项的属性,如果数组为空则不显示任何内容.

使用arrangedObjects.command节目只是"(" - 大概是它试图用每个项目显示一个逗号分隔的字符串的多行字符串.我只想要第一个.

cocoa key-value-observing key-value-coding nsarraycontroller cocoa-bindings

4
推荐指数
1
解决办法
1992
查看次数

可可中的自动键值观察

随着我对KVO和KVC的了解越来越多,我变得很好奇 -

在访问setter方法时,NSObject如何提供自动KVO?

如果我使用名为setName的访问器创建一个新对象,

当有人打电话时,观察者如何得到通知

[obj setName:@"Mystery"];

感谢您的任何反馈

cocoa cocoa-bindings

4
推荐指数
1
解决办法
344
查看次数

从阵列控制器中删除实体时如何删除实体?

我在托管对象模型中有一个实体(例如Employee),它与另外两个实体(例如Department和Team)相关.这两种关系都是一对多的(即员工必须有一个部门和一个团队,团队和部门有很多员工).这两者可能重叠也可能不重叠(例如,团队可能由来自人力资源,会计和IT的员工组成,或者可能由一个部门的几名员工组成).

Department <-->> Employee <<--> Team    
Run Code Online (Sandbox Code Playgroud)

我有两个NSArrayControllers为两个NSTableViews提供数据,一个Department表和一个Team表.员工可以在部门之间和团队之间移动而没有任何问题,但我不确定如何删除(解雇)员工.

如果我向其中一个阵列控制器发送一条删除消息,则该员工将被从团队中取出(例如),但留在部门中且对象图形处于不一致状态.即使我在两个控制器上调用remove动作,对象也不会被删除 - 它是孤立的,只是挂在空中.

最初我将部门和团队关系(Employee实体)设置为Nullify的删除规则,但即使将一个或两个更改为级联也无济于事.

我是否需要覆盖阵列控制器上的remove:action以实际删除员工,或者我是否遗漏了一些非常明显的内容?

cocoa core-data nsarraycontroller cocoa-bindings

4
推荐指数
1
解决办法
316
查看次数

NSTableView如何通过绑定修改NSArrayController的选择?

假设我有以下情况:

alt text http://img693.imageshack.us/img693/5818/controllerselection.png

当我在NSTableView中选择不同的行时,它会神奇地更新NSArrayController(PersonController)选择.NSTableView如何做到这一点?它是否像这样做:

- (void)bind:(NSString *)binding toObject:(id)observableController withKeyPath:(NSString *)keyPath options:(NSDictionary *)options;
{
 if([observableController isKindOfClass:[NSArrayController class]]){
  // got the NSArrayController, which can be used to change selection
 } else {
  // not an NSArrayController, don't try to change selection
 }

 //...
}
Run Code Online (Sandbox Code Playgroud)

我问,因为我正在实现我自己的可绑定NSControl,我希望它像NSTableView一样修改绑定的NSArrayController的选择.

cocoa objective-c nstableview nsarraycontroller cocoa-bindings

4
推荐指数
1
解决办法
2870
查看次数

如何从NSCollectionView中检索NSCollectionViewItems

我刚刚实现了一个NSCollectionView,就像在开发者页面上描述的那样,它可以很好地工作.

现在,我如何从CollectionView访问collectionViewItems?

cocoa objective-c cocoa-bindings

4
推荐指数
1
解决办法
1425
查看次数

KVO:无法删除观察者

在我的界面中,我有一个NSTextFieldvalue被绑定了NSArrayController's selection.selectedType.title.所有NSArrayController's对象都是自定义对象,每个对象有两种方法:

- (MYType *)selectedType;
- (void)setSelectedType: (MYType *)type;
Run Code Online (Sandbox Code Playgroud)

具有伊娃selectedType.但是,他们确实拥有一个容纳所有MYType物体的iVar .代码归结为:

- (MYType *)selectedType
{
   if (someIndex == 0)
        return [types objectAtIndex: 0];
    else
        return [self typeWithIndex: someIndex];
}

- (void)setSelectedType: (MYType *)type
{
     someIndex = [type index];  
}
Run Code Online (Sandbox Code Playgroud)

MYType对象得到了NSString *title一个相应的@property和iVar synthesize.

每当我打电话setSelectedType:,变化立即可见,NSTextField并且一切似乎都有效,但我得到一条日志消息说:

无法从MYType 0x1a4830中删除关键路径"selectedType.title"的观察者NSArrayController 0x141160,这很可能是因为在没有发送适当的KVO通知的情况下,"selectedType"键的值已更改.检查MYType类的KVO兼容性.

我尝试setSelectedType:使用willChangeValueForKey:和封装方法didChangeValueForKey:然后我仍然有一个日志消息,但不同的一个:

无法从MYType 0x1a4be0中删除关键路径"title"的观察者NSKeyValueObservance 0x1c7570,因为它未注册为观察者.

objective-c key-value-observing key-value-coding nsarraycontroller cocoa-bindings

4
推荐指数
1
解决办法
3136
查看次数

NSPopupButton绑定与值变换器

我不知道我用弹出式按钮填充的值是否与应变值绑定是否应该是它应该是不是 - 这是我看到的不寻常的事情(至少就我所看到的而言)值转换器和表视图)是transformedValue:方法中的"value"参数是绑定到数组控制器的整个数组,而不是数组中的单个字符串.当我使用表视图完成此操作时,变换器将为表中的每个显示行调用一次,"value"参数是绑定到该行和列的任何对象,而不是用作内容数组的整个数组对于阵列控制器.

我有一个非常简单的应用程序来测试它.在app委托中有这样的:

+(void)initialize {
    RDTransformer *transformer = [[RDTransformer alloc] init];
    [NSValueTransformer setValueTransformer:transformer forName:@"testTransformer"];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.theData = @[@{@"name":@"William", @"age":@"24"},@{@"name":@"Thomas", @"age":@"23"},@{@"name":@"Alexander", @"age":@"64"},@{@"name":@"James", @"age":@"47"}];
}
Run Code Online (Sandbox Code Playgroud)

在RDTransformer类中是这样的:

+ (Class)transformedValueClass {
    return [NSString class];
}


+(BOOL)allowsReverseTransformation {
    return NO;
}

-(id)transformedValue:(id)value {
    NSLog(@"%@",value);
    return value;
}
Run Code Online (Sandbox Code Playgroud)

在IB中,我向窗口添加了一个NSPopupButton,并在对象列表中添加了一个数组控制器.控制器的内容数组绑定到App Delegate.theData,弹出按钮的内容值绑定到Array Controller.arrangedObjects.name,其值为transform,testTransformer.

当我运行程序时,来自transformedValue:方法的日志是这样的:

2012-09-19 20:31:39.975 PopupBindingWithTransformer[793:303] (
)
2012-09-19 20:31:40.019 PopupBindingWithTransformer[793:303] (
    William,
    Thomas,
    Alexander,
    James
)
Run Code Online (Sandbox Code Playgroud)

从我在SO上可以看到的情况来看,这似乎不是其他人的经验.对于绑定或值变换器,我有什么问题吗?

macos objective-c cocoa-bindings nspopupbutton nsvaluetransformer

4
推荐指数
1
解决办法
1213
查看次数

Cocoa Bindings错误

试图将我的头围绕cocoa绑定无法确定此错误的原因

我有一个简单的应用程序,其中,app委托将Managedobjectcontext传递给Window Controller,后者将其传递给视图控制器.与视图关联的nib是一个带有数组控制器的基于视图的表.

我在app委托中启动了一些托管对象,当我运行应用程序时,表中填充了对象但是抛出了以下错误

[_NSControllerArrayProxy firstIndex]:无法识别的选择器发送到实例0x100165510

由于代码很少,不知道如何调试它

cocoa core-data nsarraycontroller cocoa-bindings

4
推荐指数
1
解决办法
569
查看次数