reloadData后错误单元格中的NSTableView按钮

时间:2017-03-01 17:27:17

标签: objective-c macos cocoa nstableview nspopupbutton

我有一个带有NSTableView的窗口,该窗口是从NSMutableArray填充的。

在一列中,我以编程方式创建NSPopUpbutton并添加项目并根据数据源数组中的值设置标题。

首次绘制窗口时,一切都很完美。如果我使用搜索功能或者表格会被[tableView reloadData]重新绘制,则单元格中的按钮全部关闭,一切都横向移动。

根据建议,我修改了我创建NSPopUpButton的方式,这样就不会反复绘制,但我无法弄清楚为什么或如何阻止它搞砸了。

我知道细胞会被回收,但我对如何确保再生细胞的清洁感到迷茫。

代码的重要部分如下(还有很多其他内容,但这就是我处理按钮的方式)

在我的标题文件中:

@public
IBOutlet NSPopUpButton *button;

在我的实施文件中,我创建了按钮:

- (void) awakeFromNib{
//Create popup button
button = [[NSPopUpButton alloc] initWithFrame:NSMakeRect(2, 1, 200, 22) pullsDown:NO];
[button setBordered:YES];
[button setButtonType:NSMomentaryLightButton];
[button setBezelStyle:NSRoundedBezelStyle];
[button setHidden:YES];
[button setAction:@selector(selectedAction:)];
}

然后在绘制视图时:

- (NSView *)tableView:(NSTableView *)table_view viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
Proposal *p = [list objectAtIndex:row];
NSString *identifier = [tableColumn identifier];

NSTableCellView *cell = [table_view makeViewWithIdentifier:identifier owner:self];

if([identifier isEqualToString:@"status"]){
    cell.textField.stringValue = @"";

    if(p){
        //Check which button we need
        if ([p.status isEqualToString:@"Approved"]){
            [cell addSubview:button];
            [button addItemWithTitle:@"Pending"];
            [button addItemWithTitle:@"Completed"];
            [button addItemWithTitle:@"Rejected"];                
            [button setTitle:@"Approved"];
            [button setHidden:NO];
        }
    }
 }
 }

代码中有更多内容(更多列),但它们不是必需的,所以我省略它们以便简洁。

这段代码成功地绘制了按钮,就像我说在第一次绘制时一切都很完美但如果表必须重新加载数据,一切都会变得非常混乱。

所以我完全难过了。我已经尝试在IB中创建按钮但是我无法从代码中访问它来更改标题或项目...我已经尝试了子类化NSPopUpButton但我最终在同一个地方。

0 个答案:

没有答案