我对绑定有点新意,不知何故阻止了它。但我现在想用它们。 谈论OSX,这是用不在IB中的代码编写的。
因此,我将数据从CoreData传入我的ArrayController。 NSCollectionView绑定到此数组控制器,如果有数据,则此绑定将显示数据。
但是,每个项目都有一些按钮,滑块,文本字段。点击后,代码将更改这些内容的标记或值。当我将更改发送到coredata并保存时,我认为这已经足够了。数组控制器不应该得到这个并在集合视图中更新我的项目吗?
因为标签(我试过的第一件事)如果在coredata中更新了,就不会更新。
这些字段必须以某种方式绑定吗?
标记以这种方式设置在NSCollectionViewItem的子类中:
[[(BEItem *)[self view] valueSlider] setTag:[[representedObject itemTag] intValue]];
我有什么要告诉CollectionView更新自己并从控制器获取新数据吗?
由于 本杰明
修改
我已经改变了我的收藏视图。我读到它是不可能绑定一个可表示的对象,并在下面的答案中,它绑定到一些属性,但这个属性也没有更新。然后我读到了你应该使用这个函数的newItemForRepresentedObject。现在,我创建了如下所示的所有内容,但程序总是在10秒后崩溃或什么都没有显示。它不断调用setChannelID,但从不将ID设置为属性。因为它总是被称为我认为这是问题。 (如果永远不会返回)
这是什么问题?我现在真的很困惑。 这只是代码,IB中没有任何内容。
在appdelegate中设置视图:
NSCollectionViewItem *testitem = [[NSCollectionViewItem alloc] init];
[testitem setView:[ChannelView new]];
self.collectionView = [[ChannelCollectionView alloc] initWithFrame:NSMakeRect(10, 0, mixerWidth, self.splitview.frame.size.height)]; // initWithFrame:[[[self window] contentView] frame]
[self.collectionView setItemPrototype:testitem];
[self.collectionView setMaxNumberOfRows:1];
[self.collectionView setAutoresizingMask:(NSViewMinXMargin | NSViewWidthSizable | NSViewMaxXMargin | NSViewMinYMargin | NSViewHeightSizable| NSViewMaxYMargin)];
[self.collectionView setAutoresizesSubviews:YES];
[self.collectionView bind:NSContentBinding toObject:self.channelController withKeyPath:@"arrangedObjects" options:nil];
诺夫:
#import <Cocoa/Cocoa.h>
@interface ChannelView : NSView
@property (readwrite, nonatomic, copy) NSString *channelName;
@property (readwrite, nonatomic, copy) NSNumber *channelID;
@property (readwrite) NSTextField *channelNameField;
@property (readwrite) NSTextField *deviceChannelField;
@end
@implementation ChannelView
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:NSMakeRect(0, 0, 300, 500)];
if (self) {
// Initialization code here.
ColorView *test = [[ColorView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
self.channelNameField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 20)];
self.deviceChannelField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 50, 100, 20)];
[self addSubview:test];
[self addSubview:self.channelNameField];
[self addSubview:self.deviceChannelField];
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
//add die teile
return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
// Drawing code here.
}
// setters.
-(void)setChannelID:(NSNumber *)chanID
{
//NSLog(@"hallo");
if (self.channelID == chanID) {
return;
NSLog(@"da");
}
else {
NSLog(@"hello"); //just this in debug output
self.channelID = [chanID copy];
NSLog(@"no output");
// self.channelID = chanID;
NSLog(@"chanid %d current: %d", chanID.intValue, self.channelID.intValue); //never shown in debug
[self.deviceChannelField setStringValue:[NSString stringWithFormat:@"%d",self.channelID.intValue]];
}
}
@end
这篇文章在我的子类NSCollectionView
中- (NSCollectionViewItem *)newItemForRepresentedObject:(ChannelsToMixes*)object
{
NSCollectionViewItem *item = [super newItemForRepresentedObject:object];
// ChannelView *view = (ChannelView *)[item view];
NSLog(@"cahnnelid: %d",object.channelID.intValue);
// [view bind:@"title" toObject:object withKeyPath:@"title" options:nil];
[item.view bind:@"channelID" toObject:object withKeyPath:@"channelID" options:nil];
//NSLog(@"test");
//NSLog(@"%@",object);
return item;
}
如果有人知道为什么setter没有设置属性给我一个提示:) 它应该能够做到这一点并且不会被释放或任何东西,至少我所知道的(使用ARC)
答案 0 :(得分:0)
是的,您必须将滑块的值绑定到CollectionViewItem。
您可以使用此方法在代码中执行此操作:
-bind:toObject:withKeyPath:options:
在你的例子中会出现这样的情况:
[[(BEItem *)[self view] valueSlider] bind:@"tag" toObject:self withKeyPath:@"itemTag" options:nil];
或者,如果您使用IB,请在InterfaceBuilder中设置值以绑定到您的集合视图项representedObject.itemTag