0

如何使用 NSTableViewDataSource 协议在单个 tableview 列中拥有复选框和文本字段(用于部分标题)?

我的要求是使用基于单元格的 TableView。

4

2 回答 2

0

以下是制作单列表格视图的步骤,其中列可以具有作为节标题(NSTextFieldCells)的行,然后是作为具有描述性标题的复选框(NSButtonCells)的行。类似于 MS MFC 中的列表框。为了与旧版本的 OS X 兼容,它需要是基于 Cell 的 tableview:

  1. 使用 IB 将 tableView 控件拖到应用程序窗口中。在属性检查器中,将内容模式设置为“基于单元格”,将列设置为 1。
  2. 使用 IB 将“复选框单元格”控件从对象库拖到应用程序窗口的列中。(注意:这一步可能可以省略,因为在下面显示的示例代码中,单元格类型被明确设置为 NSButtonCell(复选框)或 NSTextFieldCell)。如果需要扩展此示例以使用多个列,则可能需要在 IB 的 Identity Inspector 中为 NSTableColumn(s) 设置标识符,以便在代码中可以按列/行而不是仅按行进行过滤(即在方法 objectValueForTableColumn 内部)。
  3. 将 TableView 的数据源和委托设置为自动生成的 App Delegate 对象(在本例中为 ApplicationAppDelegate.h)。通过打开 IB 并使用“Connection Inspector”单击并从数据源圆形连接图标拖动到 IB 面板中的“App Delegate”对象图标,该图标显示从 NIB 加载的对象,例如控件、控制器等。 (App Delegate 的图标是一个蓝色立方体)。使用代表圆圈图标执行相同的单击和拖动操作。
  4. 打开 Assistant Editor,App Delegate 的 .h 文件显示在左侧垂直窗格中,Table View 的 IB 视图显示在右侧垂直窗格中。选择 TableView 控件并通过按住 control 键并从 TableView 控件拖动到列出属性的 .h 文件部分来创建一个名为“tableView”的 IB 插座。
  5. 在 .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
于 2013-07-05T21:36:56.310 回答
0

我在没有任何代码的情况下回答了您的其他问题,我认为您无法理解它。

- (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];
}

所以认为这会有所帮助:) 干杯。

于 2013-07-04T08:51:01.807 回答