【问题标题】:Strange behaviour when deleting NSTableView item删除 NSTableView 项目时的奇怪行为
【发布时间】:2014-04-09 21:41:13
【问题描述】:

我有一个没有绑定的基本 NSTableView(基于视图)和一个包含几个控件(水平滑块和 NSStepper)的 tableCellView。我使用滑块和步进器来调整与行关联的特定项目的值。一切都按预期工作,除非我删除了一个项目。

例如,如果我删除一个项目,然后尝试选择第 2 行中的滑块或步进器,它似乎也在选择第 3 行中的相应控件。我将每个控件连接到相同的操作,如下所示

- (IBAction)percentDidChange:(id)sender
{
    NSInteger row = [_allocationTable rowForView:sender];
    NSLog(@"The row is %ld", (long)row);
}

当我尝试调整第 2 行中的控件时,日志语句将生成以下内容

The row is 2
The row is 3
The row is -1

如果我退出此视图,然后按预期返回所有作品。

我通过以下操作删除项目

- (IBAction)removeSector:(id)sender
{
    NSInteger row = [self.allocationTable rowForView:sender];

    Allocation *allocation = [self.dataSource objectAtIndex:row];

    [self.myManagedContext deleteObject:allocation];
    NSError *anyError = nil;
    BOOL success = [self.myManagedContext save:&anyError];
    if (!success) {
        DLog(@"Error:%@", anyError);
    }

    //Update all objects
    [self renumberViewPositions];
    [self updateDataSource];
    [_allocationTable reloadData];
    [self percentCenterTextField];
    [[[self hostView] hostedGraph] reloadData];
}

而我的 Tableview 数据源方法是

- (NSView *)tableView:(NSTableView *)tableView
   viewForTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row
{
    //Setup Number Formatter
    SBIPercentFormatter *percentFormat = [[SBIPercentFormatter alloc] init];

    SBIAllocationCellView *result = [tableView makeViewWithIdentifier:@"MyView" owner:self];

    NSNumber *percentValue = [[self.dataSource objectAtIndex:row] valueForKey:@"sectorPercentage"];
    NSString *percent = [percentFormat stringFromNumber:percentValue];

    [self updateSectorPopupItems:[result sectorPopUpButton]];
    result.sectorPopUpButton.title = [[self.dataSource objectAtIndex:row] valueForKey:@"sectorName"];
    result.sectorPercentage.stringValue = percent;
    result.percentStepper.objectValue = percentValue;
    result.mySlider.objectValue = percentValue;
    return result;
}

有什么想法会导致这种行为吗?

编辑

确认此行为仅在我创建足够需要滚动视图的项目时所有 tableviewcells 可见时才会发生,然后按预期工作。

【问题讨论】:

    标签: cocoa nstableview


    【解决方案1】:
    1. 首先尝试将 NSStepper/Slider 的 Tag 设置为 "viewForTableColumn" 方法中的行值。类似于[mySlider setTag: row];

    2. 然后在您的方法-(IBAction)percentDidChange:(id)sender 上适当地转换发件人。 NSSlider *tempSlider = (NSSlider*)sender;

    3. 然后你可以通过这样做来检索正确的行

      NSInteger row = [tempSlider 标签];

    4. 打印值并查看

    【讨论】:

    • 我试过了,虽然它不再为行值返回 -1,但它会返回所有可见行、第 1 行、第 2 行、第 3 行......并移动每行中的所有相应滑块,无论我选择哪一个。
    • 没有仍在努力解决它。还有什么建议吗?谢谢
    猜你喜欢
    • 2014-10-06
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    相关资源
    最近更新 更多