我有一个没有绑定的基本NSTableView(基于视图)和一个包含几个控件的tableCellView(水平滑块和NSStepper)。我使用滑块和步进器来调整与该行关联的特定项目的值。除非我删除了一个项目,否则所有工作都按预期工作。
例如,如果我删除一个项目,然后尝试选择第2行中的滑块或步进器,它似乎也在第3行中选择相应的控件。我将每个控件连接到同一个Action,如下所示
- (IBAction)percentDidChange:(id)sender
{
NSInteger row = [_allocationTable rowForView:sender];
NSLog(@"The row is %ld", (long)row);
}
当我尝试调整第2行中的控件时,log语句将生成以下内容
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都可见时才会出现此行为,然后按预期工作。
答案 0 :(得分:1)
首先尝试将NSStepper / Slider的标记设置为" viewForTableColumn"中的行值。方法。与[mySlider setTag: row];
然后在您的方法-(IBAction)percentDidChange:(id)sender
上适当地投射发件人。 NSSlider *tempSlider = (NSSlider*)sender;
然后您可以通过
检索正确的行NSInteger row = [tempSlider tag];
打印值并参阅