NSTableViewCell选择IBAction的行号点击

时间:2016-04-05 00:25:27

标签: objective-c cocoa nstableview appkit

我遇到了一个简单的问题,但尚未找到最佳解决方案。我有一个基于NSTableView的视图,它从不同的xib加载它的单元格视图。我的表视图是动态的,基于用户输入,我将动态添加和删除最终调整表数据源的行。我的每个NSTableCellViews都有一个按钮,我将IBAction点击处理程序链接到保存表视图的NSView。我需要做的是获取在表视图中单击的按钮的行号,以便我可以处理逻辑。我能够在tableViewSelectionDidChange:(NSNotification *)notification

中成功完成此操作

我是这样做的:

- (void)tableViewSelectionDidChange:(NSNotification *)notification {
    NSTableView *tableView = [notification object];
    NSInteger selectedRow = [tableView selectedRow];
}

这对于实际点击该行的用户来说非常有效。现在,当我移动NSButton IBAction并将其链接到NSView时,如下所示:

- (IBAction)buttonClickHandler:(NSButton *)sender {
    NSInteger selectedRow = [self.tblView rowForView:sender];
    NSLog(@"%ld", (long)selectedRow);
}

我根据this选定的答案提出了这种方法。

我也试过这个:

- (IBAction)buttonClickHandler:(NSButton *)sender {

    id representedObject = [(NSTableCellView *)[sender superview] objectValue];
    NSLog(@"%@", representedObject);
}

//My configuration 

- (void)configureView {

    [self.view setFrame:[self bounds]];
    [self addSubview:self.view];

    [self.view setWantsLayer:YES];

    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];

    self.tblView.delegate = self;
    self.tblView.dataSource = self;





    [self.tblView setIntercellSpacing:NSMakeSize(0, 0)];

    [self.tblView registerNib: [[NSNib alloc] initWithNibNamed:@"ParentCellXib" bundle:nil] forIdentifier:@"ParentCell"];
    [self.tblView registerNib: [[NSNib alloc] initWithNibNamed:@"ChildCellXib" bundle:nil] forIdentifier:@"ChildCell"];
    [self.tblView registerNib: [[NSNib alloc] initWithNibNamed:@"HeaderCellXib" bundle:nil] forIdentifier:@"HeaderCell"];
}

但是表示的对象返回null。如果值得一提,我已经将我的文件所有者设置为包含tableView的视图,这样我就可以链接IBAction,并将TableCellView子类化为另一个类。但是,据我所知,我不认为这是问题的一部分。是否有一个简单的解决方案可以根据该单元格中的按钮单击可靠地为我提供selectedRow编号?我上面尝试的两种方法分别返回-1和null。

3 个答案:

答案 0 :(得分:-1)

我会在NSButton的标签属性中设置行:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    SomeTableCellView *cell = [tableView makeViewWithIdentifier:@"cell" owner:self];
    if (cell == nil) {
        cell = // init some table cell view
        cell.identifier = @"cell";
    }

    cell.button.tag = row;
    [cell.button setTarget:self];
    [cell.button setAction:@selector(buttonAction:)];
}

- (IBAction)buttonAction:(id)sender {
    NSLog(@"row: %d", sender.tag);
}

答案 1 :(得分:-1)

试试这个

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    yourCustomeCell *aCell;
    NSString *aStrIdentifier = @"yourIdentiFier";
    aCell = (yourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:aStrIdentifier];

    //you have to set your indexpath
    objc_setAssociatedObject(aCell.btnUpload_or_Add, @"objBtn", indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [aCell.YourButton addTarget:self action:@selector(yourButtonActiontapped:) forControlEvents:UIControlEventTouchUpInside];

    return aCell;
}

-(IBAction)yourButtonActiontapped:(UIButton *)sender{

    NSIndexPath *aIndPath =  objc_getAssociatedObject(sender, @"objBtn");
    NSLog(@"row:%@",aIndPath.row);
}
  

您还必须导入#import <objc/runtime.h>

在IBAction中获取行的另一种方法是TAG,但objc是TAG更好的选择。

答案 2 :(得分:-1)

创建UIButton的子类,并为该按钮添加NSIndexPath的属性。在cellForRowAtIndexPath方法中使用此按钮。将单元格的索引路径指定为按钮的索引路径。

点按,获取发件人的索引路径。在你的案例中,该按钮的索引路径。