0

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

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

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

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

Нужно ли как-то связать эти поля?

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

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

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

Благодаря Бенджамин

EDIT

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

В чем проблема? Im действительно запутался в коллекции. И это всего лишь код, ничего в 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)

+0

Или мне нужно привязать каждую порцию полей к представленному объекту, но насколько я могу видеть, что тег не является связующим? – bennibeef

+0

добавлен новый код, чтобы показать новую проблему – bennibeef

ответ

0

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

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

-bind:toObject:withKeyPath:options: 

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

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

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

enter image description here

+0

Спасибо, помогли, но я полностью изменил свой CollectionView. Он показывает свои представления и пытается связать мое текстовое поле, но его как-то не удается установить свойства в itemView. – bennibeef

Смежные вопросы