OSX Cocoa NSButton类型复选框"全选"问题,以及如何解决?

时间:2014-10-21 21:37:58

标签: xcode macos cocoa

我在表格视图中有多个复选框。在桌子之外,我有一个带动作的复选框,选择所有看起来像这样:

- (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

1 个答案:

答案 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];
}