如何使用NSTableViewDataSource协议在单个表视图列中设置复选框和文本字段(用于节标题)?
我的要求是使用基于单元格的TableView。
我在没有任何代码的情况下回答了您的另一个问题,我认为您很难理解。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
array = [[NSMutableArray alloc]initWithObjects:@0,@1,@2, nil];//instead this you can add your class object
[self.myTableView reloadData];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
return [array count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSButtonCell * cell =[[NSButtonCell alloc]init];
[cell setButtonType:NSSwitchButton];
if([array objectAtIndex:row] == [NSNumber numberWithInt:0])
{
[tableColumn setDataCell:cell];
[[tableColumn dataCell]setTitle:@"Are you single?"];// instead this you can access title from your class object or from any other storage
}
else if ([array objectAtIndex:row] == [NSNumber numberWithInt:1])
{
[tableColumn setDataCell:[[NSTextFieldCell alloc]init]];
}
else if ([array objectAtIndex:row] == [NSNumber numberWithInt:2])
{
[tableColumn setDataCell:cell];
[[tableColumn dataCell]setTitle:@"Are you happy?"];
}
return [array objectAtIndex:row];
}
所以我认为这会有所帮助:)干杯。
以下是制作单列表视图的步骤,其中列可以有作为节标题的行(NSTextFieldCells),然后是具有描述性标题的复选框(NSButtonCells)。类似于MS MFC中的列表框。为了与旧版本的OS X兼容,它需要是一个基于Cell的表视图:
- 使用IB将tableView控件拖动到应用程序窗口中。在"属性"检查器中,将"内容模式"设置为"基于单元格",并将"列"设置为1
- 使用IB将"复选框单元格"控件从对象库拖动到应用程序窗口的列中。(注意:这一步骤可能可以省略,因为在下面显示的示例代码中,单元格类型被明确设置为NSButtonCell(复选框)或NSTextFieldCell)。如果需要扩展此示例以使用多列,那么可能需要在IB的Identity Inspector中设置NSTableColumn的Identifier,以便在代码中可以按列/行而不是仅按行进行筛选(即在方法objectValueForTableColumn内部)
- 将TableView的数据源和委托设置为自动生成的App delegate对象(在本例中为ApplicationAppDelegate.h)。方法是打开IB,使用"连接检查器"从数据源圆圈连接图标单击并拖动到IB面板中的"App delegate"对象图标,该图标显示从NIB加载的对象,如控件,控制器等(App Delegate的图标为蓝色立方体)。对代理圆图标执行相同的单击和拖动操作
- 打开Assistant Editor,App Delegate的.h文件显示在左侧垂直窗格中,表视图的IB视图显示在右侧垂直窗格中。在TableView控件上进行选择,并通过按住控制键并从TableView控件拖动到.h文件中列出属性的部分来创建一个名为"TableView"的IB出口
- 在.h文件中声明一个NSMutableArray变量。它应该如下所示(注意:已经添加了NSTableViewDataSource作为ApplicationAppDelegate的支持协议):
#import <Cocoa/Cocoa.h>
@interface ApplicationAppDelegate : NSObject <NSApplicationDelegate,NSTableViewDataSource>
{
NSMutableArray *state;
}
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTableView *tableView;
@end
6。将以下功能添加到App Delegate实现文件(.m)中:
#import "ApplicationAppDelegate.h"
@implementation ApplicationAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
state = [[NSMutableArray alloc]initWithObjects:@"Section Heading:",@0,@1, nil];//Note: values passed to NSButtonCells should be 0 or 1 or YES or NO, and the state passed to NSTextFieldCell is a NSString
[self.tableView reloadData];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
return [state count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSButtonCell * cell =[[NSButtonCell alloc]init];
[cell setButtonType:NSSwitchButton];
if (row == 0)
{
[tableColumn setDataCell:[[NSTextFieldCell alloc]init]];
}
else if (row == 1)
{
[tableColumn setDataCell:cell];
[[tableColumn dataCell]setTitle:@"title row1"];
}
else if (row == 2)
{
[tableColumn setDataCell:cell];
[[tableColumn dataCell]setTitle:@"title row2"];
}
return [state objectAtIndex:row];
}
- (void)tableView:(NSTableView *)tableView setObjectValue:(id)value forTableColumn:(NSTableColumn *)column row:(NSInteger)row
{
[state replaceObjectAtIndex:row withObject:value];
[tableView reloadData];
}
@end