NSArrayController привязан к NSCollectionview

Я новичок в привязках, как-то предотвратил это. Но я хочу использовать их сейчас. Говоря об OSX, и это запрограммировано в коде, а не в IB.

Итак, у меня есть данные, поступающие из CoreData в мой ArrayController. NSCollectionView привязан к этому контроллеру массива, и если есть данные, эта привязка работает, данные отображаются.

Но у каждого элемента есть кнопки, ползунки, текстовые поля. По щелчку код изменит тег или значение этих вещей. Я думал, что достаточно, когда я отправляю изменение в coredata и сохраняю его. Разве контроллер массива не должен получить это и обновить мои элементы в представлении коллекции?

Потому что теги (первое, что я попробовал) не обновляются, если они обновляются в coredata.

Эти поля должны быть как-то связаны?

тег устанавливается в подклассе NSCollectionViewItem следующим образом:

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

Есть ли что-нибудь, что я должен сказать CollectionView, чтобы обновить себя и получить новые данные от контроллера?

Спасибо, Бенджамин.

ИЗМЕНИТЬ

Я изменил представление о коллекции. Я читал, что на самом деле невозможно связать представляемый объект, и в ответе ниже он привязан к некоторому свойству, но это свойство также не обновляется. Затем я прочитал о newItemForRepresentedObject, что вы должны использовать эту функцию. Теперь я создал все, как показано ниже, но программа всегда вылетает через 10 секунд или что-то в этом роде, и ничего не отображается. Он постоянно вызывает setChannelID, но никогда не устанавливает идентификатор для свойства. Из-за этого его всегда называют, я думаю, что это проблема. (если никогда не возвращается)

В чем проблема? Я действительно смущен представлением коллекции. И это просто код, ничего в 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;
}

Если кто-нибудь знает, почему установщик не устанавливает свойство, дайте мне совет :) Он должен быть в состоянии сделать это и не выпущен или что-то еще, по крайней мере, то, что я знаю (используя ARC)


person bennibeef    schedule 13.09.2013    source источник
comment
Или мне нужно привязать каждую порцию полей к представленному объекту, но, насколько я вижу, тег не является привязываемым параметром?   -  person bennibeef    schedule 13.09.2013
comment
добавлен новый код, чтобы показать новую проблему   -  person bennibeef    schedule 16.09.2013


Ответы (1)


Да, вы должны привязать значение вашего ползунка к вашему CollectionViewItem.

Вы можете сделать это в коде с помощью этого метода:

-bind:toObject:withKeyPath:options:

Что будет выглядеть в вашем примере так:

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

Или, если вы используете IB, в InterfaceBuilder, установив значение для привязки к вашему элементу представления коллекции representedObject.itemTag

введите здесь описание изображения

person Sitses    schedule 14.09.2013
comment
Спасибо, помогло, но теперь я полностью изменил свой CollectionView. Он показывает свои представления и пытается связать мое текстовое поле, но почему-то не может установить свойства в itemView. - person bennibeef; 16.09.2013