Я довольно новичок в 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
OK Я добавил журнал для выхода в applicaitonDidFinishLaunching, и это ничто из этого, что объясняет, почему я не вижу никаких данных. Но почему это было бы ноль? – ssloan
При ближайшем рассмотрении self.toDoListTableView всегда равен нулю, даже в методе numberOfRowsInTableView, когда он вызывается в начале. Наверное, он не подключен к розетке правильно? – ssloan
Я думаю, это потому, что вы установили IBOutlet для назначения, а не для слабого или небезопасного. –