2014-09-18 2 views
0

Это продолжение по предыдущему вопросу. Извините. Я не мог понять, как добавить код или редактировать что-то написанное более 5 минут назад.NSTableView не отображается

Краткое резюме. Я пытаюсь отобразить персонализированный/производный TableView над обычным представлением. Я не использую IB, но все делаю из кода. Целью здесь является создание приложения, а также изучение программирования Cocoa/OSX. Это моя первая попытка кодирования OSX.

NSView, поверх которого я хотел бы отображать мой пользовательский TableView, отображается хорошо. Извините мусор NSLog. Это помогает мне узнать о жизненном цикле приложения. Заголовок:

#import <Cocoa/Cocoa.h> 
#import "MSNavigationTableView.h" 

@interface MSNavigationPanelView : NSView 

@property (strong, nonatomic) IBOutlet MSNavigationTableView *myNavigationTable; 

@end 

код:

#import "MSNavigationPanelView.h" 

@implementation MSNavigationPanelView 

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
     NSLog(@"Initializing Navigation Panel"); 
    } 
    self.myNavigationTable = [[MSNavigationTableView alloc] initWithFrame:self.frame]; 
    [self.myNavigationTable setDataSource:self.myNavigationTable]; 
    [self.myNavigationTable setDelegate:self.myNavigationTable]; 
    [self addSubview:self.myNavigationTable]; 
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [super drawRect:dirtyRect]; 
    // Drawing code here. 
    NSLog(@"Drawing navigation view!"); 
} 

@end 

Теперь NSTableView производный класс. Заголовок:

#import <Cocoa/Cocoa.h> 

@interface MSNavigationTableView : NSTableView <NSTableViewDataSource> 

@end 

NSArray *myNavigationArray; 

Источник:

#import "MSNavigationTableView.h" 

@implementation MSNavigationTableView 

+ (void)initialize { 
    NSLog(@"Called NavigationTableView::initialize!"); 
    myNavigationArray = [NSArray arrayWithObjects:@"Call History" @"Contacts", @"Messages", @"Voicemail", nil]; 
} 

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
    } 
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [super drawRect:dirtyRect]; 
    // Drawing code here. 
} 

- (NSInteger)numberOfRowsInTableView: (NSTableView *) aTableView 
{ 
    return [myNavigationArray count]; 
} 

- (id)tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    NSLog([myNavigationArray objectAtIndex:rowIndex]); 
    return [myNavigationArray objectAtIndex:rowIndex]; 
} 

@end 

Спасибо. Я уверен, что я делаю что-то глупое и/или, возможно, не делаю что-то необходимое. Я попытался понять это на пару часов. Пока нет идей.

+0

В чем проблема? Вид таблицы не отображается? Попытка переместить инициализацию табличного представления из метода инициализации MSNavigationPanelView и переместить его в метод awakeFromNib' (void) MSNavigationPanelView – Will

+0

Это не сработало. Я предполагаю, что у меня что-то не хватает. –

+0

Вы найдете свой предыдущий вопрос, спуститесь в пространство чуть выше своего имени и под списком тегов (в нескольких дюймах отсюда) и нажмите «редактировать». –

ответ

0

Я понял, что нужно сделать.

Сначала инициализация массива должна быть перенесена из + (void) в другой метод. Для меня - (id) initWithFrame отлично работает.

Во-вторых, в то время как это было непонятно для меня, перезапись NSTableViewDataSource недостаточна.

Необходимо создать NSTableColumn (s), а затем добавить столбец (столбцы) в таблицу, используя метод addTableColumn класса NSTableView. Как только это будет сделано, мы перейдем к setDataSource и так далее.

0

Вам действительно нужно использовать Interface Builder для создания таблицы. Я бы никогда не пытался программно инициализировать таблицу ... ко многим настройкам.

NSTableView должен иметь NSTableColumns, NSTableColumns должен иметь NSCell и т. Д. И т. Д. NSTableView должен быть встроен в NSScrollView.

+0

NSTableView - это самый сложный вид для изучения какао. –

+0

Я ценю совет. Я уверен, что вы знаете, о чем говорите. Тем не менее, я хочу использовать производный класс NSTableView и сделать это без IB. –

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