Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
Objective c 带有复选框单元格的NSTableView_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c 带有复选框单元格的NSTableView

Objective c 带有复选框单元格的NSTableView,objective-c,macos,cocoa,Objective C,Macos,Cocoa,在Xcode 4上将NSTableView添加到我的xib后,我将其设置为有4列。第一列是包含项目名称的简单列。其他3个是复选框。我将一个复选框单元格从对象库拖动到tableview 我填充表格,并创建和显示复选框,但是如果单击“无事发生”,则无法选中或取消选中它们。此外,我甚至不知道如何通过代码来实现它 我如何才能做到这一点:能够选中或取消选中复选框,并从代码中获取它们的状态 我已经看到了,但它并没有真正回答我的问题 以下是根据要求处理表的一些代码: - (int)numberOfRowsIn

在Xcode 4上将
NSTableView
添加到我的xib后,我将其设置为有4列。第一列是包含项目名称的简单列。其他3个是复选框。我将一个
复选框单元格
从对象库拖动到tableview

我填充表格,并创建和显示复选框,但是如果单击“无事发生”,则无法选中或取消选中它们。此外,我甚至不知道如何通过代码来实现它

我如何才能做到这一点:能够选中或取消选中复选框,并从代码中获取它们的状态

我已经看到了,但它并没有真正回答我的问题

以下是根据要求处理表的一些代码:

- (int)numberOfRowsInTableView:(NSTableView *)tableView
{
    return (int)[myArray count];
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
    if([[tableColumn identifier] isEqualToString:@"col1"])
    {
       return[NSNumber numberWithInt:NSOffState];
    }    

    return [myArray objectAtIndex:row];
}

- (void)tableView:(NSTableView *)tableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSLog(@"%d", [anObject boolValue]);
    if([[tableColumn identifier] isEqualToString:@"col1"])
    {
        NSLog(@"click col1");
    }        
    if([[tableColumn identifier] isEqualToString:@"col2"])
    {
        NSLog(@"click col2");
    }        

}
我只是添加了更多的代码。如何将其设置为选中/取消选中?

模型 您需要决定一个模型,即如何表示表视图上显示的数据。例如:

// SomeObject.h
#import <Foundation/Foundation.h>
@interface SomeObject
@property (copy) NSString *name;
@property (assign,getter=isVisible) BOOL visible;
@property (assign,getter=isOpaque) BOOL opaque;
@property (assign,getter=isAnimatable) BOOL animatable;
@end

// SomeObject.m
#import "SomeObject.h"
@implementation SomeObject
@synthesize name, visible, opaque, animatable;
- (void)dealloc {
    [name release];
    [super dealloc];
}
@end
使用表视图中的值更新模型
通过使用键值编码可以简化此代码,但在掌握表视图数据源之后,这只是一个练习:P

能否编辑您的问题并向我们展示
-tableView:setObjectValue:forTableColumn:row:
的实现?
-tableView:objectValueForTableColumn:row:
的实现也会有所帮助。您要在数组中插入什么类型的对象?如何将对象的内容映射到四列?您的代码将整个对象映射到四列。我有一个数组,其中字符串位于第一列。然后剩下的我就卡住了。请看我刚才添加的代码。谢谢,一切都很好,但是什么是
obj
?SomeObject可以是任何东西。如果我在声明行时传递
NSInteger
,那么它将不起作用。除此之外,我不知道如何将复选框设置为开或关(NSOffState或NSOnState)是的,现在我真的很困惑。我很感激你的帮助,但我一点也不明白。我是说,你在前面的问题中看到了我在做什么。你刚刚发布的代码。。。嗯,我不能从中得到任何东西,我真的看不出这对我有什么帮助。我真的不明白你刚才写了什么。I@MrA
obj
是要插入到数组中的对象。您不能简单地拥有一个字符串数组:与复选框对应的值将存储在哪里?这就是为什么我声明了一个
SomeObject
类,它的实例保留一个字符串(对于第一列)和三个布尔值(对于其他三列)。对于没有混合状态的复选框,可以将它们的ON/OFF状态视为布尔值。谢谢,现在更清楚了。因此,除了数组之外,我还必须填充需要声明新对象的表?或者我可以使用数组(NSMutableArray)?@MrA想法是您有一个可变数组(
myArray
),其中存储一个类的实例,该类可以表示所有四列(一个字符串,三个布尔值/整数值)。在我的示例中,数组中存储的元素是
SomeObject
的实例。另一种选择是让数组中的每个元素都是
NSDictionary
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
    // Retrieve the model object corresponding to `row'
    SomeObject *obj = [myArray objectAtIndex:row];

    // Return the object property corresponding to the column
    if([[tableColumn identifier] isEqualToString:@"name"])
    {
        return obj.name;
    }
    // Since this method has return type `id', we need to box the
    // boolean values inside an `NSNumber' instance
    else if([[tableColumn identifier] isEqualToString:@"visible"])
    {
        return [NSNumber numberWithBool:obj.visible];
    }
    else if([[tableColumn identifier] isEqualToString:@"opaque"])
    {
        return [NSNumber numberWithBool:obj.opaque];
    }
    else if([[tableColumn identifier] isEqualToString:@"animatable"])
    {
        return [NSNumber numberWithBool:obj.animatable];
    }

    return nil;
}
- (void)tableView:(NSTableView *)tableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    // Retrieve the model object corresponding to `row'
    SomeObject *obj = [myArray objectAtIndex:row];

    // Set the object property corresponding to the column
    if([[tableColumn identifier] isEqualToString:@"name"])
    {
        obj.name = anObject;
    }
    // Since the new value (`anObject') is an object, we need to
    // convert it to `BOOL' by sending it `-boolValue'
    else if([[tableColumn identifier] isEqualToString:@"visible"])
    {
        obj.visible = [anObject boolValue];
    }        
    else if([[tableColumn identifier] isEqualToString:@"opaque"])
    {
        obj.opaque = [anObject boolValue];
    }        
    else if([[tableColumn identifier] isEqualToString:@"animatable"])
    {
        obj.animatable = [anObject boolValue];
    }
}