初始化NSTableView

时间:2012-06-23 17:28:57

标签: objective-c cocoa nstableview

我对Cocoa很新,我正在尝试设置一个由数组支持的表视图。我已将app delegate设置为tableview的数据源,并实现了NSTableViewDataSource协议。

当我运行应用程序时,我得到以下日志输出:

  

2012-06-23 18:25:17.312 HelloWorldDesktop [315:903]待办事项列表为零   2012-06-23 18:25:17.314 HelloWorldDesktop [315:903]行数为0
  2012-06-23 18:25:17.427 HelloWorldDesktop [315:903]应用确实完成了   启动

我认为当我在tableView上调用reloadData时,它会再次调用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

2 个答案:

答案 0 :(得分:1)

我要检查的第一件事是你的NSTableView IBOutlet仍然在applicationDidFinishLaunching中设置。

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

您应该看到如下输出:

<NSTableView: 0x178941a60>

如果插座设置正确。

如果您看到'nil'而不是对象,请仔细检查以确保您的NSTableView在Xcode的XIB编辑模式下连接到您的插座。这是一个documentation link来帮助连接网点。

答案 1 :(得分:0)

我修复了它 - 我将appDelegate设置为tableView的数据源和委托,但是从tableView拖动到appDelegate,但是我没有用ctrl拖动另一种方式实际链接插座我用表视图声明了。它现在正在运作。谢谢你的帮助,但杰夫。