我在表格视图中有多个复选框。在桌子之外,我有一个带动作的复选框,选择所有看起来像这样:
- (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];
}
}
}
}
该代码效果很好,但查看不会更新。
我试过[mainTable reloadData]
,但我的猜测不是那个。
简单的问题如何更新视图?
我试过了:
1)创建新的NSButton并替换旧的NSButton但没有运气。视图未更新。
2)尝试动态创建NSButton而不是使用Designer然后应用代码,没有运气。 这也很奇怪。当我在cellView中创建动态元素时,只有子视图是我用设计师创建的。
3)[button setNeedsDisplay:YES]
也不起作用;
我不是经验丰富的Mac程序员。
更新
-(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"];
我终于得到了这个:
if([flag[@"ischecked"] boolValue] == 1){
[checkBox setState:YES];
}
else{
[checkBox setState:NO];
}
[cellView addSubview:checkBox];
//other subview shere
return cellView;
}
return nil;
}
这部分代码用于添加子视图。
NEW UPDATE
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 *emails
必须是NSMutableDictionary *emails
但我不知道如何将对象添加到NSMutableDictionary;
如果我这样做:
for(NSMutableDictionary *dict in emails){
NSLog(@"%@", dict);
[dict setObject:@"1" forKey:@"ischecked"];
}
我收到错误:
[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance
答案 0 :(得分:2)
假设emails
是您的数据来源:
NSDictionary *flag = [emails objectAtIndex:row];
flag
是indexPath的字典。
您需要修改电子邮件,使其保留复选框的值,然后在viewForTableColumn
内执行:
[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];
}