Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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/10.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 NSView实例化并使用标识符获取其值_Objective C_Macos_Cocoa_Nsview - Fatal编程技术网

Objective c NSView实例化并使用标识符获取其值

Objective c NSView实例化并使用标识符获取其值,objective-c,macos,cocoa,nsview,Objective C,Macos,Cocoa,Nsview,我有一个名为clickView的NSView子类,如下所示 // clickView.h @interface clickView : NSView { BOOL onOff; } - (BOOL)getOnOff; // clickView.m - (BOOL)getOnOff { return onOff; } - (void)mouseDown:(NSEvent *)event { if (onOff) { onOff = NO; }

我有一个名为clickView的NSView子类,如下所示

// clickView.h
@interface clickView : NSView {
    BOOL onOff;
}

- (BOOL)getOnOff;

// clickView.m
- (BOOL)getOnOff {
    return onOff;
}

- (void)mouseDown:(NSEvent *)event {
    if (onOff) {
        onOff = NO;
    } else {
        onOff = YES;
    }
    [self setNeedsDisplay:YES];
    NSLog(@"%@",self.identifier);
}
// AppDelegate.m
- (IBAction)create4Clicked:(id)sender {    
    NSInteger rowCount = 10;
    NSInteger colCount = 10;
    NSInteger k = 1;
    for (NSInteger i2 = 0; i2 < rowCount; i2 ++) {
        for (NSInteger i3 = 0; i3 < colCount; i3 ++) {
            NSView *view = [[clickView alloc] initWithFrame:NSMakeRect(50+i2*10,50+i3*10,10,10)];
            [view setIdentifier:[NSString stringWithFormat:@"%li",k]];
            [view1 addSubview:view]; // view1 is NSView that's been created with Interface Builder
            k++;
        }
    }
}
它利用其drawRect方法(此处未显示)在用户单击矩形时用颜色填充矩形。它使用一个布尔值onOff来查看它是否被点击。现在,切换到AppleLegate,我实例化这个NSView子类,如下所示

// clickView.h
@interface clickView : NSView {
    BOOL onOff;
}

- (BOOL)getOnOff;

// clickView.m
- (BOOL)getOnOff {
    return onOff;
}

- (void)mouseDown:(NSEvent *)event {
    if (onOff) {
        onOff = NO;
    } else {
        onOff = YES;
    }
    [self setNeedsDisplay:YES];
    NSLog(@"%@",self.identifier);
}
// AppDelegate.m
- (IBAction)create4Clicked:(id)sender {    
    NSInteger rowCount = 10;
    NSInteger colCount = 10;
    NSInteger k = 1;
    for (NSInteger i2 = 0; i2 < rowCount; i2 ++) {
        for (NSInteger i3 = 0; i3 < colCount; i3 ++) {
            NSView *view = [[clickView alloc] initWithFrame:NSMakeRect(50+i2*10,50+i3*10,10,10)];
            [view setIdentifier:[NSString stringWithFormat:@"%li",k]];
            [view1 addSubview:view]; // view1 is NSView that's been created with Interface Builder
            k++;
        }
    }
}
现在,我在view1 NSView上显示了100个正方形。如果我点击任何一个方块,我会得到它的标识符。现在,我需要弄清楚的是如何判断哪个方块的“onOff”设置为YES或NO

谢谢你的帮助。

A.首先:

也许你对Cocoa和Objective-C还不熟悉

a。你为什么不用按钮呢

b。onOff显然是一种属性。为什么不使用声明的属性

B.对你的问题:

通过向superview询问其子视图,然后使用谓词过滤它们,可以检索具有特定状态的视图:

NSPredicate *clickedPredicate = [NSPredicate predicateWithFormat:@"onOff == %d", YES];
NSArray* clickViews = [view1 subviews]; // Returns all subviews
clickViews = [clickViews filteredArrayUsingPredicate:clickedPredicate]; // On-views

但是您应该考虑将状态存储在视图之外。你的应用程序是做什么用的?

谢谢。不,我对Cocoa或Objective-C并不完全陌生。我已经做了14个月左右了。我不知道为什么我不知道如何在这种情况下使用NSPredicate,这让你觉得我对他们是新手。无论如何,谢谢。在这种情况下,我不使用按钮,因为当其类型设置为“Switch”时,按钮的大小会受到限制。不,我的想法与NSPredicate无关,但没有使用声明的属性和错误的getter名称。看起来像是一个javaist在短时间内完成了Objective-C。