在基于视图的NSTableView中使用checkBox发出问题

时间:2012-06-27 22:19:25

标签: objective-c interface-builder nstableview nsbutton

我有一个包含所有数据的NSDictionary:

  • 一个标题(对这个问题不重要)
  • 一个链接(此问题不重要)
  • 一个NSDictionary数组,再次包含1个标题和1个链接

我在基于视图的表格视图中显示此数据,如下所示:

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tv
{
    if (tv == _downloadTable) 
    //I use this "if" because I have another tableView that has nothing to do
    //with this one
    {
        return [[myDictionary objectForKey:@"myArray"] count];
    }
}

我想在这个tableView中有两列,一列用于显示标题,另一列用一个复选框,这可以让我知道检查哪一行。

- (NSView *)tableView:(NSTableView *)tv viewForTableColumn :(NSTableColumn *)tableColumn row :(NSInteger)row 
{
    if (tv == _downloadTable) 
    {
        if (tableColumn == _downloadTableTitleColumn) 
        {
            if ([[[myDictionary         objectForKey:@"myArray"]objectAtIndex:row]objectForKey:@"title"]) 
            {
            NSString *title = [[[myDictionary objectForKey:@"myArray"]objectAtIndex:row]objectForKey:@"title"];
            NSTableCellView *result = [tv makeViewWithIdentifier:tableColumn.identifier owner:self];
            result.textField.stringValue = title;
            return result;
            }
        }
       if (tableColumn == _downloadTableCheckColumn) 
       {
           NSLog(@"CheckBox"); //I wanted to see exactly when that was called
                               //But it didn't help me :(
           NSButton *button = [[NSButton alloc]init];
           [button setButtonType:NSSwitchButton];
           [button setTitle:@""];
           return button;
       }
   }
}

现在当我运行它并单击复选框时它什么都不做 (当然因为我不知道如何让它做点什么。 我应该把代码放在哪里?

主要目标是可编辑的下载列表,现在显示列表,每行的标题旁边都有复选框。 我想知道检查了哪个复选框,哪些不是。

我试过了:

[button setAction:@selector(checkBoxAction:)];

- (void)checkBoxAction: (id)sender
{
   NSLog(@"I am button : %@ and my state is %ld", sender, (long)[sender state]);
}

但我无法弄清楚如何获取该按钮的行,以了解哪个标题与此复选框相关联。

我还尝试了setObjectValue的{​​{1}}方法,但没有成功。

我希望它的工作方式是:

我有一个“开始下载”按钮,用于检查是否选中了每个复选框,并仅使用选中的行启动下一个操作(下载)。

我想避免绑定,因为我打算让它在iOS上运行,我也不想为iOS提供不同的代码。

2 个答案:

答案 0 :(得分:3)

您可以使用NSTableView方法-rowForView:获取特定视图所在的行。

在你的情况下,你会有这样的事情:

- (void)checkBoxAction:(id)sender
{
    NSInteger row = [_downloadTable rowForView:sender];
    NSLog(@"The button at row %ld was clicked.", row);
}

以下是NSTableView的文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/Reference/Reference.html

答案 1 :(得分:1)

您可以尝试使用按钮'标签属性为您放置的每个按钮设置它作为tableview中的数字(位置)。看这里!!!

Detecting which UIButton was pressed in a UITableView

<强> [EDIT1]

如果人们真的决定阅读链接帖子,你就会意识到答案实际上就在那里。

尝试添加:

[button setTag:row];
[button addTarget:self action:@selector(checkBoxAction:) forControlEvents:UIControlEventTouchUpInside];

在viewForTableColumn例程的else中:

在checkBoxAction例程中:

- (void)checkBoxAction: (id)sender{
   NSLog(@"I am button : %@ and my state is %@", sender.tag, [sender state]);
}

我还认为,一旦开始深入研究代码,您就会想要开始使用TableViewCell对象的自动出列功能。我相信你会发现自己处于内存alloc / dealloc问题。