已经开始使用Core Data了,虽然我已经想出如何在常规的Cocoa应用程序中使用它,但它似乎在Cocoa Touch中有所不同.如何将实体绑定到Cocoa Touch中的表格单元格等对象?
cocoa cocoa-touch core-data nsarraycontroller cocoa-bindings
在调用更新底层数组的方法时,如何更新绑定到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].这是正确的方法吗?复制数组,释放旧数组并更新副本(而不是仅添加到现有数组)似乎非常麻烦.
我有一个图像数组和两个nib文件.一个nib文件有一个窗口,在NSTableView中显示图像.另一个笔尖有一个窗口,可以将图像数组绘制到NSView中,还可以在所选图像上绘制一个突出显示.
图像数组由NSArrayController控制.我无法让两个笔尖共享NSArrayController.我会有两个单独的NSArrayControllers绑定到相同的内容,但我也希望两个笔尖共享控制器的选择; 也就是说,如果在表格窗口中选择图像,它也会在另一个窗口中被选中.
有没有标准的方法来做到这一点?
我试图复制核心数据中现有的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) 我有一个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
我在托管对象模型中有一个实体(例如Employee),它与另外两个实体(例如Department和Team)相关.这两种关系都是一对多的(即员工必须有一个部门和一个团队,团队和部门有很多员工).这两者可能重叠也可能不重叠(例如,团队可能由来自人力资源,会计和IT的员工组成,或者可能由一个部门的几名员工组成).
Department <-->> Employee <<--> Team
Run Code Online (Sandbox Code Playgroud)
我有两个NSArrayControllers为两个NSTableViews提供数据,一个Department表和一个Team表.员工可以在部门之间和团队之间移动而没有任何问题,但我不确定如何删除(解雇)员工.
如果我向其中一个阵列控制器发送一条删除消息,则该员工将被从团队中取出(例如),但留在部门中且对象图形处于不一致状态.即使我在两个控制器上调用remove动作,对象也不会被删除 - 它是孤立的,只是挂在空中.
最初我将部门和团队关系(Employee实体)设置为Nullify的删除规则,但即使将一个或两个更改为级联也无济于事.
我是否需要覆盖阵列控制器上的remove:action以实际删除员工,或者我是否遗漏了一些非常明显的内容?
假设我有以下情况:
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
我试图实现几乎最简单的将NSTableView绑定到NSArrayController的情况,以便NSTableView由NSArray支持.
这是设置:
但是,对应于Model的行不会出现在表中,除非我也这样做:[self.arrayController setContent: self.array].
有没有办法可以使用在Interface Builder中连接的绑定来实现此功能?我原以为NSArrayController的'Content Array'直接绑定到NSArray这意味着我不必以编程方式设置内容.知道为什么会帮助我更好地理解绑定.
我正在尝试一个简单的应用程序,其中有一个可变数组的可变数组,例如 -
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
在我的界面中,我有一个NSTextField谁value被绑定了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
cocoa ×8
objective-c ×5
core-data ×3
nstableview ×3
binding ×1
cocoa-touch ×1
copy ×1
nsbuttoncell ×1