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

时间:2014-02-11 12:30:58

标签: 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;
    } else {
        onOff = YES;
    }
    [self setNeedsDisplay:YES];
    NSLog(@"%@",self.identifier);
}

如果用户点击它,它会利用其 drawRect 方法(此处未显示)用颜色填充矩形。它使用布尔值(onOff)来查看它是否被点击。现在,切换到 AppleDelegate ,我按如下方式实例化此NSView子类。

// 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个方块。如果我点击任何方块,我会得到它的标识符。 (请参阅&#39; mouseDown。&#39;)现在,我需要弄清楚的是如何判断哪个方块有&#39; onOff&#39;设置为YES(或NO)。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

一个。首先关闭所有:

可能你是Cocoa和Objective-C的新手。

一个。你为什么不用按钮?

湾onOff显然是一个财产。为什么不使用声明的属性?

B中。致你的问:

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

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

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

相关问题