2012-06-23 3 views
0

Я довольно новичок в Cocoa, и я пытаюсь настроить табличный вид, поддерживаемый массивом. Я настроил делегат приложения в качестве источника данных для таблицы и реализовал протокол NSTableViewDataSource.Инициализация NSTableView

Когда я запустить приложение, я получаю следующий вывод журнала:

2012-06-23 18:25:17.312 HelloWorldDesktop[315:903] to do list is nil
2012-06-23 18:25:17.314 HelloWorldDesktop[315:903] Number of rows is 0
2012-06-23 18:25:17.427 HelloWorldDesktop[315:903] App did finish launching

Я подумал, что, когда я назвал reloadData на Tableview было бы назвать еще раз numberOfRowsInTableView:(NSTableView *)tableView обновить представление, но это не кажется чтобы происходить. Что я пропустил?

Мои листы .h и .m представлены ниже.

AppDelegate.h

#import <Cocoa/Cocoa.h> 

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource> 

@property (assign) IBOutlet NSWindow *window; 
@property (assign) IBOutlet NSTableView * toDoListTableView; 

@property (assign) NSArray * toDoList; 

@end 

AppDelegate.m

#import "AppDelegate.h" 

@implementation AppDelegate 

@synthesize window = _window; 
@synthesize toDoList; 
@synthesize toDoListTableView; 

- (void)dealloc 
{ 
    [self.toDoList dealloc]; 
    [super dealloc]; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSLog(@"App did finish launching"); 
    // Insert code here to initialize your application 
    // toDoList = [[NSMutableArray alloc] init]; 
    toDoList = [[NSMutableArray alloc] initWithObjects:@"item 1", @"item 2", nil]; 
    [self.toDoListTableView reloadData]; 
    // NSLog(@"table view %@", self.toDoListTableView); 

} 

//check toDoList initialised before we try and return the size 
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView { 
    NSInteger count = 0; 
    if(self.toDoList){ 
     count = [toDoList count]; 
    } else{ 
     NSLog(@"to do list is nil"); 
    } 
    NSLog(@"Number of rows is %ld", count); 
    return count; 
} 

-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    NSLog(@"in objectValueForTable"); 
    id returnVal = nil; 

    NSString * colId = [tableColumn identifier]; 

    NSString * item = [self.toDoList objectAtIndex:row]; 

    if([colId isEqualToString:@"toDoCol"]){ 
     returnVal = item; 
    } 

    return returnVal; 

} 

@end 

ответ

1

Первое, что я бы проверить, что вы NSTableView IBOutlet все еще установлен в applicationDidFinishLaunching.

NSLog(@"self.toDoListTableView: %@", self.toDoListTableView) 

Вы должны увидеть выход, как:

<NSTableView: 0x178941a60> 

если выход установлен правильно.

Если вы видите «ноль», а не объект, дважды проверьте, чтобы ваш NSTableView был подключен к вашей розетке в режиме редактирования XIB Xcode. Вот вам documentation link, чтобы помочь подключить розетки.

+0

OK Я добавил журнал для выхода в applicaitonDidFinishLaunching, и это ничто из этого, что объясняет, почему я не вижу никаких данных. Но почему это было бы ноль? – ssloan

+0

При ближайшем рассмотрении self.toDoListTableView всегда равен нулю, даже в методе numberOfRowsInTableView, когда он вызывается в начале. Наверное, он не подключен к розетке правильно? – ssloan

+0

Я думаю, это потому, что вы установили IBOutlet для назначения, а не для слабого или небезопасного. –

0

Я исправил его - я установил appDelegate в качестве источника данных и делегата для tableView, но ctrl-перетаскивание из tableView в appDelegate, но я не перетащил ctrl-ссылку, чтобы на самом деле связать который я объявил с табличным представлением. Теперь работает. Спасибо за вашу помощь, хотя Джефф.