【问题标题】:Making a NSTableView with check boxes in one of the columns在其中一列中制作带有复选框的 NSTableView
【发布时间】:2014-04-10 23:25:26
【问题描述】:

我正在尝试设置一个表格视图,其中一列是字符串列表,另一列是第一列中每个元素的复选框列表。我想我从根本上误解了如何在 NSTableView 协议中实现各种方法。请注意,任何提供的解决方案都不需要支持旧版本的 OSX。

以下是我的实现。请注意,我的 tableView 有 2 列,其中第一列(和单元格)有一个名为 "myCell" 的标识符。第二列(和单元格)有一个名为"checkBoxCell" 的标识符。我的第一列按预期运行,其中我的数组中的每个元素都映射到第一列中的一行。但是,当我尝试通过 makeViewWithIdentifier:owner 创建我的 checkBoxCell 时,我的整个表格视图变成了一种透视,我可以在桌面上看到我所有的东西。我不知道这是为什么。您可以在我的 else 语句中看到我试图检查复选框的不同事物的集群,但无济于事。 我的问题可以归结为这一点。

1) 为什么我的tableview在使用makeViewWithIdentifier:owner时会“透视”

2) 在表格视图中分配单元格的正确范例是什么?我怎样才能调整我的代码来完成这个?

这是我的代表的标题。

#import <Cocoa/Cocoa.h>

@interface BMAppDelegate : NSObject <NSApplicationDelegate,NSTableViewDataSource,NSTableViewDelegate>

@property(nonatomic,strong)NSMutableArray* schemes;
@property(nonatomic,strong)NSMutableArray* checkedStates;


@property (assign) IBOutlet NSWindow *window;

@property (weak) IBOutlet NSButtonCell *buildButton;
@property (weak) IBOutlet NSTableView *schemeTableView;
@property (weak) IBOutlet NSButtonCell *buildCheckBox;

@property (nonatomic, strong) __block NSTask *buildTask;
@property (nonatomic) BOOL isRunning;
@property (nonatomic, strong) NSPipe *outputPipe;

@end

这是我的实现。

#import "BMAppDelegate.h"
#import "BMSchemeHandler.h"

@implementation BMAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
      self.schemes = [BMSchemeHandler parseSchemeFileToArray];
    self.schemeTableView.dataSource=self;
    self.schemeTableView.delegate=self;
    self.checkedStates=[[NSMutableArray alloc]init];



}

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
    return (self.schemes.count);
}

-(void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
    if([tableColumn.identifier isEqualToString:@"buildCheckBox"]){
        [self.checkedStates insertObject:[NSNumber numberWithInt:[object intValue]] atIndex:row];
        [self.buildCheckBox setState:[[self.checkedStates objectAtIndex:row] intValue]];
    }

    [tableView reloadData];
}


-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
   if([tableColumn.identifier isEqualToString:@"myCell"]){ //first column
       NSTextFieldCell* cell=[[NSTextFieldCell alloc]initTextCell:[self.schemes objectAtIndex:row]];
        return cell;
   }else{ //2nd column
   //NSButtonCell* cell=[tableView makeViewWithIdentifier:@"buildCheckBox" owner:self];
  // NSButtonCell* checkBox=[[NSButtonCell alloc]init];
   // self.buildCheckBox=[[NSButtonCell alloc]init];
   //self.buildCheckBox=[tableView makeViewWithIdentifier:@"buildCheckBox" owner:self];
   // [cell setState:[[self.checkedStates objectAtIndex:row] intValue]];
   //
  [self.buildCheckBox setState:[[self.checkedStates objectAtIndex:row] intValue]];
   return self.buildCheckBox;
   }
    return nil;
}

这是我在界面生成器中的布局。

这是我的“透视”表,通常它在窗口后面显示 xcode 中的代码,但在截取它的屏幕截图后它采用了这种形式。

【问题讨论】:

    标签: objective-c macos nstableview


    【解决方案1】:

    如果您在没有绑定的情况下执行此操作,则需要实现 NSTableViewDelegate 方法 tableView:viewForTableColumn:row: 在其中您将使用标识符 buildCheckBox 为相应列出列 NSTableCellView,并在那里进行状态分配,并返回修改了 NSTableCellView 实例,以便表格可以显示它。

    NSTableViewDatasource 协议只是为表格中的每个行/列索引提供一个值。当用户修改表中的数据时也会调用它,从而可以改变对应的源数据。这就是setObjectValue 应该做的——只是更新与用户更改的单元格对应的对象实例。同样,“objectValueForTableColumn:row”只会为您的表返回一个 NSString 或 NSNumber(bool)。

    NSTableViewDelegate 是表格调用来获取适当的子视图,如果您实现tableView:viewForTableColumn:row:,您可以更改单元格子视图的状态。

    如果您要使用绑定,您可以将复选框的状态绑定到表格视图的 objectValue。这意味着您可以跳过修改视图的委托方法。如果您要使用数组控制器,您同样可以跳过为每个单元格提供 objectValue 的数据源方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-17
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多