标签: nsarraycontroller

什么是Cocoa Touch相当于NSArrayController?

已经开始使用Core Data了,虽然我已经想出如何在常规的Cocoa应用程序中使用它,但它似乎在Cocoa Touch中有所不同.如何将实体绑定到Cocoa Touch中的表格单元格等对象?

cocoa cocoa-touch core-data nsarraycontroller cocoa-bindings

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

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
查看次数

如何在Core Data中制作NSManagedObject的Deep Copy

我试图复制核心数据中现有的NSManagedObject和相关的子对象.我似乎找不到一个简单的方法来做到这一点.

我有一个从Core Data数据库填充的NSArrayController.我想在selectionIndex处获取对象并进行深层复制,使其与同一父对象相关并复制所有子对象.

任何帮助表示赞赏!

感谢TechZen的链接.我使用了该站点的示例代码并使用了此调用代码:

RuleSetVersion *object = [[ruleSetVersionArrayController selectedObjects] lastObject];

NSString *parentEntity = @"RuleSet";

RuleSetVersion *newObject = (RuleSetVersion*)[self copyObject:object toContext:[self managedObjectContext] parent:parentEntity];

[newObject setRuleSetEffectiveDate:[[NSDate alloc] init]];
[newObject setRuleSetVersionLastModifiedDate:[[NSDate alloc] init]];

[newObject setRuleSet:object.ruleSet];

NSError *error;

if ([managedObjectContext save:&error] == NO) {
    [NSApp presentError:error];
}
Run Code Online (Sandbox Code Playgroud)

copy core-data nsarraycontroller nsmanagedobject

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

KVO:+ keyPathsForValuesAffecting <Key>不能与NSObjectController的(子类)一起使用

我有一个KVO-able类(称之为Observee),其affectedValue动态属性受affectingValue属性影响.属性之间的依赖关系由实现+keyPathsForValuesAffectingAffectedValue方法定义.

设置一个值以affectingValue通知affectedValue 已按我的预期更改, 除非 Ovservee是它的子类NSObjectController.完整示例如下:

@interface Observee : NSObject // or NSObjectController
@property (readonly, strong, nonatomic) id affectedValue;
@property (strong, nonatomic) id affectingValue;
@property (strong, nonatomic) NSArrayController *arrayController;
@end

@implementation Observee

@dynamic affectedValue;
- (id)affectedValue { return nil; }

+ (NSSet *)keyPathsForValuesAffectingAffectedValue {
  NSLog(@"keyPathsForValuesAffectingAffectedValue called");
  return [NSSet setWithObject:@"affectingValue"];
}

@end

@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (strong, nonatomic) Observee *observee;
@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)notification …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c key-value-observing nsarraycontroller nsobjectcontroller

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

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

我在托管对象模型中有一个实体(例如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
查看次数

由NSArrayController支持的NSTableView:为什么setContent:工作而IB不工作?

我试图实现几乎最简单的将NSTableView绑定到NSArrayController的情况,以便NSTableView由NSArray支持.

这是设置:

  1. 我有一个NSArrayController,其'Content Array'绑定到我的app委托中的NSArray.
  2. 在NSArrayController的"对象控制器"中,类名设置为Model,即NSArray中包含的对象类型.
  3. NSTableView的单个列的"Value"绑定到Array Controller的'arrangeObjects'的键'name',它是Model类的唯一字段.
  4. 在我的app委托的applicationDidFinishLaunching中,我初始化了NSArray,并插入了一些Model对象.

但是,对应于Model的行不会出现在表中,除非我也这样做:[self.arrayController setContent: self.array].

有没有办法可以使用在Interface Builder中连接的绑定来实现此功能?我原以为NSArrayController的'Content Array'直接绑定到NSArray这意味着我不必以编程方式设置内容.知道为什么会帮助我更好地理解绑定.

cocoa binding nstableview nsarraycontroller

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

如何使用绑定在表视图中显示按钮单元格(复选框)标题

我正在尝试一个简单的应用程序,其中有一个可变数组的可变数组,例如 -

NSMutableDictionary *sample6 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"title6",@"title",[NSNumber numberWithBool:NO],@"state", nil];
Run Code Online (Sandbox Code Playgroud)

在IB中,我使用NSButtonCell(复选框)创建了一个表视图.

我能够使用以下表格列绑定显示复选框状态(已选中或未选中):

Value - ArrayController.arrangedObjects.state
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它显示了一个带有标题的复选框数组 - "Check",如下面的屏幕截图所示:

在此输入图像描述

现在我的目标是使用绑定显示复选框标题,这样它从相同的可变字典中获取值,从中获取其状态.

我尝试按钮单元格的绑定,但它不起作用:

title - > ArrayController.selection.title

我也试过这个按钮单元的绑定:

title - > ArrayController.arrangedObjects.title

但它没有用,在使用上面的绑定之后看起来像这样:

在此输入图像描述

任何人都可以建议我使用哪个控制器密钥,如果这不是显示标题的正确方法那么这样做的正确方法是什么?

cocoa objective-c nstableview nsarraycontroller nsbuttoncell

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

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
查看次数