【问题标题】:NSView Instantiation and Get Its Values with IdentifierNSView 实例化并使用标识符获取其值
【发布时间】:2014-03-09 05:49:14
【问题描述】:

我有一个名为 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 个方块。如果我点击任何一个方块,我会得到它的标识符。 (参见“mouseDown”。)现在,我需要弄清楚如何判断哪个方格的“onOff”设置为 YES(或 NO)。

感谢您的帮助。

【问题讨论】:

    标签: objective-c macos cocoa nsview


    【解决方案1】:

    A.首先:

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

    一个。为什么不用按钮?

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

    B.问:

    您可以通过向父视图询问其子视图来检索具有特定状态的视图,然后使用谓词对其进行过滤:

    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 让您认为我是他们的新手。不管怎样,谢谢。在这种情况下我不使用按钮,因为当它的类型设置为“开关”时它的大小受到限制。
    • 不,我的想法与 NSPredicate 无关,但没有使用声明的属性和错误的 getter 名称。看起来像一个 javaist 在短时间内做 Objective-C。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多