Objective c NSView实例化并使用标识符获取其值
我有一个名为clickView的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.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。