NSArrayController привязан к NSCollectionview
Я вроде новичок в привязках, как-то помешал этому. Но я хочу использовать их сейчас. Говоря об OSX, и это запрограммировано в коде, а не в IB.
Итак, у меня есть данные, поступающие из CoreData в мой ArrayController. NSCollectionView привязан к этому контроллеру массива, и если есть данные, эта привязка работает, данные отображаются.
Но у каждого элемента есть несколько кнопок, ползунков, текстовых полей. При щелчке код изменит тег или значение этих вещей. Я подумал, что достаточно отправить изменения в coredata и сохранить их. Разве массив контроллеров должен получить это и обновить мои элементы в представлении коллекции?
Потому что теги (первое, что я попробовал) не обновляются, если они обновляются в coredata.
Эти поля должны быть как-то связаны?
тег устанавливается в подклассе NSCollectionViewItem следующим образом:
[[(BEItem *)[self view] valueSlider] setTag:[[representedObject itemTag] intValue]];
Есть ли что-то, что я должен сказать CollectionView, чтобы обновить себя и получить новые данные от контроллера?
Спасибо бенджамин
РЕДАКТИРОВАТЬ
Я изменил мою коллекцию. Я читал, что на самом деле невозможно связать представимый объект, и в ответе ниже он связан с некоторым свойством, но это свойство также не обновляется. Затем я прочитал о newItemForRepresentedObject, что вы должны использовать эту функцию. Теперь я создал все, как показано ниже, но программа всегда вылетает через 10 секунд или что-то, и ничего не отображается. Он постоянно вызывает setChannelID, но никогда не устанавливает идентификатор для свойства. Из-за этого его всегда называют, я думаю, что это проблема. (Если не получится только вернуться)
В чем здесь проблема? Я действительно смущен коллекцией. И это всего лишь код, ничего в IB.
Настройка View в 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];
Channelview:
#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)
1 ответ
Да, вы должны привязать значение вашего ползунка к вашему CollectionViewItem.
Вы можете сделать это в коде с помощью этого метода:
-bind:toObject:withKeyPath:options:
Который будет выглядеть в вашем примере следующим образом:
[[(BEItem *)[self view] valueSlider] bind:@"tag" toObject:self withKeyPath:@"itemTag" options:nil];
Или, если вы используете IB, в InterfaceBuilder, установив значение для привязки к вашему коллекционному элементу просмотра representedObject.itemTag