0

我对绑定有点陌生,以某种方式阻止了它。但我现在想使用它们。谈论 OSX,这是用代码而不是 IB 编程的。

所以,我有来自 CoreData 的数据到我的 ArrayController 中。NSCollectionView 绑定到此数组控制器,如果有数据,则此绑定有效,显示数据。

但是,每个项目都有一些按钮、滑块、文本字段。单击时,代码将更改这些事物的标记或值。我认为将更改发送到 coredata 并保存就足够了。数组控制器不应该得到这个并更新我在collectionview中的项目吗?

因为标签(我尝试的第一件事)如果在 coredata 中更新,则不会更新。

这些字段是否必须以某种方式绑定?

以这种方式在 NSCollectionViewItem 的子类中设置标签:

[[(BEItem *)[self view] valueSlider] setTag:[[representedObject itemTag] intValue]];

有什么我必须告诉 CollectionView 更新自身并从控制器获取新数据的吗?

谢谢本杰明

编辑

我改变了我的收藏视图。我读到绑定一个可表示的对象是不可能的,在下面的答案中,它绑定到某个属性,但这个属性也没有更新。然后我读到 newItemForRepresentedObject 你应该使用这个函数。现在,我创建了如下所示的所有内容,但程序总是在 10 秒后崩溃或什么都没有显示。它不断调用 setChannelID,但从未将 ID 设置为属性。因为它总是被称为我认为这是问题所在。(如果永远不会只返回)

这里有什么问题?我现在真的对collectionview感到困惑。这只是代码,在 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)

4

1 回答 1

1

是的,您必须将滑块的值绑定到 CollectionViewItem。

您可以使用此方法在代码中执行此操作:

-bind:toObject:withKeyPath:options:

在您的示例中看起来像这样:

[[(BEItem *)[self view] valueSlider] bind:@"tag" toObject:self withKeyPath:@"itemTag" options:nil];

或者,如果您使用 IB,则在 InterfaceBuilder 中通过设置绑定到您的集合视图项的值representedObject.itemTag

在此处输入图像描述

于 2013-09-14T23:15:42.783 回答