Xcode OSX按钮类型复选框“;选择全部";问题,以及如何解决?
我在表视图中有多个复选框。在表外,我有一个带有action select all的复选框,如下所示:Xcode OSX按钮类型复选框“;选择全部";问题,以及如何解决?,xcode,macos,cocoa,Xcode,Macos,Cocoa,我在表视图中有多个复选框。在表外,我有一个带有action select all的复选框,如下所示: - (IBAction)selectAll:(NSButton *)sender { for (int i = 0; i < [mainTable numberOfRows]; i++) { NSTableCellView *cellView = [mainTable makeViewWithIdentifier:@"MainCell" owner:self];
- (IBAction)selectAll:(NSButton *)sender {
for (int i = 0; i < [mainTable numberOfRows]; i++) {
NSTableCellView *cellView = [mainTable makeViewWithIdentifier:@"MainCell" owner:self];
for(NSButton *button in cellView.subviews){
//I have multiple buttons, i need one with toolTip
if([[button toolTip] isEqualToString:@"select"]){
[button setState:sender.state];
}
}
}
}
我终于明白了:
if([flag[@"ischecked"] boolValue] == 1){
[checkBox setState:YES];
}
else{
[checkBox setState:NO];
}
[cellView addSubview:checkBox];
//other subview shere
return cellView;
}
return nil;
}
这部分代码用于添加子视图
新更新
-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
NSDictionary *flag = [emails objectAtIndex:row];
NSString *identifier = [tableColumn identifier];
if([identifier isEqualToString:@"MainCell"]){
NSTableCellView *cellView = [tableView makeViewWithIdentifier:@"MainCell" owner:self];
[cellView.textField setStringValue:flag[@"subject"]];
cellView.textField.drawsBackground = YES;
[cellView.textField setBackgroundColor:[NSColor whiteColor]];
//[cellView setBackgroundStyle:NO];
NSButton *checkBox;
NSRect frame_checkbox = NSMakeRect(7, 35 , 317, 20);
checkBox = [[NSButton alloc] initWithFrame:frame_checkbox];
//NSLog(@"Message id: %@", flag[@"id"]);
[checkBox setButtonType:NSSwitchButton];
[checkBox setObjectValue:flag[@"id"]];
[checkBox setState:NO];
[checkBox setTitle:@""];
[checkBox setToolTip:@"Select message with Id"];
NSMutableArray *emails;
emails = [[NSMutableArray alloc] init];
[emails addObject:@{@"id":@"1", @"from":@"some name",
@"subject":@"some subject",
@"email":@"some email",
@"date":@"10 min ago",
@"ischecked":@NO}];
因为这是NSMutableArray,所以我没有addObject。
要执行addObject操作,必须将NSMutableArray*电子邮件
设置为NSMutableDictionary*电子邮件
但我不知道如何将Object添加到NSMutableDictionary中
如果我这样做:
for(NSMutableDictionary *dict in emails){
NSLog(@"%@", dict);
[dict setObject:@"1" forKey:@"ischecked"];
}
我得到一个错误:
[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance
假设
电子邮件
是您的数据源:
NSDictionary*flag=[emails objectAtIndex:row]代码>
flag
是您的字典
您需要修改电子邮件,使其保留复选框的值,然后在viewfortable列中执行以下操作:
[checkbox setState:flag[@"ischecked"] ? NSOffState : NSOnState];
并检查所有这些:
- (IBAction)selectAll:(NSButton *)sender {
NSMutableArray *emailCopy = [[NSMutableArray alloc]init];
for(NSDictionary *dict in emails){
NSLog(@"dict = %@", dict);
NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init];
[newDict addEntriesFromDictionary:dict];
[newDict setObject:@"1" forKey:@"ischecked"];
[emailCopy addObject:newDict];
NSLog(@"newDict = %@", newDict);
}
emails = emailCopy;
[tableView reloadData];
}
这违反了MVC的概念,您希望更新您的数据模型,以便在重新加载数据源时,您的表知道如何显示复选框的正确状态。@meda您想再解释一下吗?您是说我使用SetNeedsDisplay:是的,仅在重新加载数据时才使用?不是的,我是说您不应该依赖单元格,因为它们可以重复使用,您应该做的是更新数据源,以便在表中有逻辑勾选复选框或不勾选一次reloaded@meda我明白你的意思。因此,我无法使用此单元格方法以编程方式更新NSButton状态?是的,我的建议是编程的,就像您将数据源上的所有复选框设置为“是”,然后在tableDelegate中根据布尔值检查它们我为您提供了该[复选框设置状态:标志[@“ischecked”]的代码?NSOFSTATE:NSOnState]查看更新数据的代码>日志标志您的意思是:[复选框setState:flag[@“ischecked”]?NSOffState:NSState];[cellView添加子视图:复选框];在我的示例中,您没有使用类似bool的字符串,因为您有一个字符串需要与1
bool isChecked=[flag[@“isChecked”]isEqualToString:@“1”]代码>然后您可以执行[复选框设置状态:ischecked?NSOffState:nsstate]代码>我重构代码并添加@“ischecked”:@NO到每个电子邮件对象,然后[newDict setObject:@YES forKey:@“ischecked”];