如何使用NSTableViewDataSource协议在单个tableview列中使用复选框和文本字段?

时间:2013-06-25 21:37:58

标签: cocoa checkbox tableview nsbuttoncell

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

我的要求是使用基于Cell的TableView。

2 个答案:

答案 0 :(得分: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];
}

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

答案 1 :(得分:0)

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

  1. 使用IB将tableView控件拖到应用程序窗口中。在“属性”检查器中,将“内容模式”设置为“基于单元格”,将“列”设置为“。
  2. 使用IB将“Check Box Cell”控件从对象库拖到应用程序窗口的列中。 (注意:此步骤可能可以省略,因为在下面显示的示例代码中,单元格类型被明确设置为NSButtonCell(复选框)或NSTextFieldCell)。如果需要扩展此示例以使用多个列,那么可能需要在IB的Identity Inspector中设置NSTableColumn的标识符,以便在代码中可以按列/行而不是仅按行进行过滤(即方法objectValueForTableColumn)。
  3. 将TableView的数据源和委托设置为自动生成的App Delegate对象(在本例中为ApplicationAppDelegate.h)。通过打开IB并使用“连接检查器”单击并从数据源圆圈连接图标拖动到IB面板中的“App Delegate”对象图标来执行此操作,该图标显示从NIB加载的对象,如控件,控制器等。 (App Delegate的图标是蓝色立方体)。使用委托圆圈图标执行相同的单击和拖动操作。
  4. 打开“助理编辑器”,左侧垂直窗格中显示App Delegate的.h文件,右侧垂直窗格中显示“表视图”的IB视图。在TableView控件上选择并创建一个名为“tableView”的IB插座,方法是按住控制键并从TableView控件拖动到列出属性的.h文件部分。
  5. 在.h文件中声明NSMutableArray变量。它应该如下所示(注意:已经添加了NSTableViewDataSource作为ApplicationAppDelegate支持的协议):

  6. #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