我有一个带有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
但我最终在同一个地方。