Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode OSX按钮类型复选框“;选择全部";问题,以及如何解决?_Xcode_Macos_Cocoa - Fatal编程技术网

Xcode OSX按钮类型复选框“;选择全部";问题,以及如何解决?

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];

我在表视图中有多个复选框。在表外,我有一个带有action select all的复选框,如下所示:

- (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”];