0

我正在审查一个示例程序,其中可能通过使用 IB 将 Checkbox 单元格拖到单个列中,在 tableview 中创建了一系列复选框。在示例中,AppDelegate 是具有 numberOfRowsInTableView:、setObjectValue: 和 objectValueForTableColumn: 实现的数据源。

在 objectValueForTableColumn 中:复选框的状态在返回的数组中设置为“0”或“1”。

我不清楚的是:

1)如何设置每行复选框的属性?例如如何设置复选框标题?在示例中,每行的每个复选框的标题为“复选框”。我希望每行中的每个复选框都有一个唯一的标题。

2)如何设置其他复选框按钮属性,如启用/禁用等?

3)如何创建复选框?我假设它们是在调用 numberOfRowsInTableView: 之后以某种方式创建的,当 NIB 中的对象被实例化时。如何最好地访问这些对象以执行更改属性之类的操作?Apple 的 TableView 文档虽然冗长,但似乎缺乏任何可以澄清的例子。

4

2 回答 2

2

根据评论“我很欣赏代码示例,但不幸的是,我需要一个基于单元格的表格视图才能在 10.7 之前的 OS X 版本上运行。”

在这种情况下,您可以评论该方法

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row

您可以使用委托方法(willDisplayCell)进行替换。确保删除该方法并使表格视图基于单元格。拖放复选框(NSButtonCell)。实施相同。其余一切保持不变。

/* Delegate Method For the same example explained in the above answer */
    - (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
    {
        NSUInteger tableCol = [tableView.tableColumns indexOfObject:tableColumn];
        if(tableCol == 0)
        {
            NSDictionary *valueDictionary = [self.myArray objectAtIndex:row];
            NSString *titleValue = [valueDictionary valueForKey:@"Name"];
            [cell setTitle:titleValue];

            NSUInteger mod = row % 2;
            if(mod == 0)
            {
                [cell setState:NSOnState];
            }
            else
            {
                [cell setState:NSOffState];
            }
        }
        else
        {
            [cell setTitle:@"Column 2"];        
        }
    }

这应该是您所期望的:)

供您参考:表视图对象应采用以下方式:

在此处输入图像描述

并且表视图绑定应采用以下方式

在此处输入图像描述

并且数组控制器绑定应该是下面的方式:

在此处输入图像描述

如果您仍然面临这个问题,请告诉我。

于 2013-06-24T15:34:09.277 回答
2

这只是一个例子。

按照步骤完成:

  1. 拖放表格视图。
  2. 将表格单元格视图 (NSTableCellView) 拖放到表格视图单元格内。现在,您的表格视图是基于视图的。
  3. 将表格单元格视图 (NSTableCellView) 的标识符设置为“CheckBoxCell”-> 第一列的 NSTableCellView 并将另一列的表格单元格视图设置为“TextBoxCell”。
  4. 删除 NSTableCellView 中存在的图像视图。
  5. 拖放一个复选框(不是 NSButtonCell,它应该是 NSButton)。
  6. 拖放阵列控制器并放置一个插座“myArrayController”
@interface ExAppDelegate : NSObject <NSApplicationDelegate,NSTableViewDelegate>

@property (assign) IBOutlet NSWindow *window;


@property (strong) NSMutableArray *myArray;

@property (strong) IBOutlet NSTableView *myTableView;

@property (strong) IBOutlet NSArrayController *myArrayController;

@end
@implementation ExAppDelegate
@synthesize myArray;
@synthesize myTableView;

- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
    [self.myTableView setDelegate:self];
    if(self.myArray == nil)
    {
        self.myArray = [NSMutableArray array];
        for (NSUInteger i=0; i < 10; i++)
        {
            NSMutableDictionary *test = [NSMutableDictionary dictionary];
            [test setValue:[NSString stringWithFormat:@"%ld",i] forKey:@"Name"];
            NSUInteger marks = i + 10;
            [test setValue:[NSString stringWithFormat:@"%ld",marks] forKey:@"Marks"];
            [self.myArray addObject:test];
        }
    }
   [self.myArrayController rearrangeObjects];
}



- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSTableCellView *checkBoxCell = nil;

    if(tableView == self.myTableView)
    {
        //Get the Column Number
        NSUInteger tableCol = [tableView.tableColumns indexOfObject:tableColumn];
        if(tableCol == 0)
        {           
           checkBoxCell = (NSTableCellView *)[tableView makeViewWithIdentifier:@"CheckBoxCell" owner:tableColumn];
            NSArray *myViews = [checkBoxCell subviews];
            NSButton *checkBoxButton = [myViews objectAtIndex:0];

            NSDictionary *valueDictionary = [self.myArray objectAtIndex:row];
            NSString *titleValue = [valueDictionary valueForKey:@"Name"];
            [checkBoxButton setTitle:titleValue];

            NSUInteger mod = row % 2;
            if(mod == 0)
            {
                [checkBoxButton setState:NSOnState];
            }
            else
            {
                [checkBoxButton setState:NSOffState];
            }
        }
        else
        {
            checkBoxCell = (NSTableCellView *)[tableView makeViewWithIdentifier:@"TextBoxCell" owner:tableColumn];

        }
    }   

    return checkBoxCell;
}

@end

==============================================

Bindings(Ignoring Data Source) myArrayController -> 绑定到 -> ExAppDelegate -> 内容数组 -> 模型键路径 -> self.myArray tableView -> 绑定到 -> 表格内容 -> 内容数组 -> arrayController -> 排列的对象。不要为表视图绑定设置任何模型键​​路径

==============================================

  1. 我已将 Outlet 作为 mytableView 设置为 NSTableView
  2. 假设表视图中有两列
  3. 假设一列应设置为复选框单元格,另一列应设置为文本字段单元格

*您希望将唯一标题设置为复选框单元格以及标记为选中与否。(仅供参考:我交替标记选中和未选中,就像第一行将被选中,第二行将被选中,依此类推......)

  1. 我正在考虑一个包含带有 2 个键的字典的数组 - > 第一个键(名称)第二个键(标记)

  2. 然后稍后实现方法“- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row”

    我希望这将有助于解决问题。:)

于 2013-06-24T09:58:28.990 回答