Objective-C:在里面使用"if else"语句 - (void)drawRect来获取一个复选框状态?

Jes*_*ess 1 checkbox cocoa objective-c nsview drawrect

我正在尝试设计一个界面,当用户单击复选框时,它将在NSView框中显示图像.有12个复选框,我有...在我的脑海里...... if else语句的布局,以处理所有不同的复选框组合.我在-(void)drawRect:(NSRect)rect声明中列出了if else语句,但它们似乎没有起作用.(我没有得到错误).我已经发现它在程序首次启动时会正确评估if else语句.但是,当我单击激活包含" setNeedsDisplay:" 的操作的复选框时,不会重新评估"if else"语句.(这当然意味着我不明白究竟如何setNeedsDisplay:work.lol)

NSLog在各个地方写了几个陈述,看看发生了什么.我在 - (void)drawRect声明中有一个,以确保它setNeedsDisplay:正常工作.它就是.每当我单击一个复选框时,它都会激活setNeedsDisplay.我NSLog在"if else"声明中将两个地方放在两个地方:第一部分:

- (void)drawRect:(NSRect)rect {

if ([cNatural state] == NSOnState) {
    NSLog(@"C Natural Selected");
    NSPoint cNaturalPos;
    cNaturalPos = NSMakePoint(35, 0);
    NSImage * cNaturalImage;
    cNaturalImage = [NSImage imageNamed:@"cNatural.png"];
    [cNaturalImage dissolveToPoint:cNaturalPos fraction:(1.0)];}
else 

    if ([dFlat state] == NSOnState) {
        NSPoint dFlatPos;
        dFlatPos = NSMakePoint(35, 0);
        NSImage * dFlatImage;
        dFlatImage = [NSImage imageNamed:@"cSharp.png"];
        [dFlatImage dissolveToPoint:dFlatPos fraction:(1.0)];}
    else
          ......................
Run Code Online (Sandbox Code Playgroud)

还有一个在第一组"if else"条件结束时:

        if ([bNatural state] == NSOnState) {
            NSPoint bNaturalPos;
            bNaturalPos = NSMakePoint(35, 0);
            NSImage * bNaturalImage;
            bNaturalImage = [NSImage imageNamed:@"bNatural.png"];
            [bNaturalImage dissolveToPoint:bNaturalPos fraction:(1.0)];}

        else {
             NSLog(@"No First Note Selection.");
             NSPoint emptyStaffPos;
             emptyStaffPos = NSMakePoint(35, 0);
             NSImage * emptyStaffImage;
             emptyStaffImage = [NSImage imageNamed:@"emptyStaff.png"];
             [emptyStaffImage dissolveToPoint:emptyStaffPos fraction:(1.0)];}
Run Code Online (Sandbox Code Playgroud)

我希望在首次加载程序时,我的控制台中会出现"No First Note Selection".确实如此.不会发生的是,当我激活"cNatural"复选框时,它会在控制台中显示"No First Note Selection"字符串.就像它没有注册复选框的状态更改一样.

To make sure I had the checkboxes properly connected in Interface Builder, I created this line of code that activates when the checkbox is toggled: (This code also includes the setNeedsDisplay:)

- (IBAction)rendStaffCanvas:(id)sender  {


[staffDrawingCanvas setNeedsDisplay:YES];

if ([cNatural state] == NSOnState) {
    NSLog(@"C Natural checkbox: ON");
}
else {
    NSLog(@"C Natural checkbox: OFF");
}
if ([dFlat state] == NSOnState) {
    NSLog(@"D Flat checkbox: ON");
}
else {
    NSLog(@"D Flat checkbox: OFF");
}
if ([dNatural state] == NSOnState) {
    NSLog(@"D Natural checkbox: ON");
}
Run Code Online (Sandbox Code Playgroud)

All of this displays as I would expect in the console, but the "if else" statements in the -(void)drawRect part just don't seem to be registering.

I have looked everywhere and can't find a solution to this. Any help will be much appreciated.

Here is the rather lengthy code for my .m file:

#import "StaffCanvas.h"

@implementation StaffCanvas

- (IBAction)rendStaffCanvas:(id)sender  {
[staffDrawingCanvas setNeedsDisplay:YES];
if ([cNatural state] == NSOnState) {
    NSLog(@"C Natural checkbox: ON");
}
else {
    NSLog(@"C Natural checkbox: OFF");
}
if ([dFlat state] == NSOnState) {
    NSLog(@"D Flat checkbox: ON");
}
else {
    NSLog(@"D Flat checkbox: OFF");
}
if ([dNatural state] == NSOnState) {
    NSLog(@"D Natural checkbox: ON");
}
else {
    NSLog(@"D Natural checkbox: OFF");
}
if ([eFlat state] == NSOnState) {
    NSLog(@"E Flat checkbox: ON");
}
else {
    NSLog(@"E Flat checkbox: OFF");
}
if ([eNatural state] == NSOnState) {
    NSLog(@"E Natural checkbox: ON");
}
else {
    NSLog(@"E Natural checkbox: OFF");
}
if ([fNatural state] == NSOnState) {
    NSLog(@"F Natural checkbox: ON");
}
else {
    NSLog(@"F Natural checkbox: OFF");
}
if ([gFlat state] == NSOnState) {
    NSLog(@"G Flat checkbox: ON");
}
else {
    NSLog(@"G Flat checkbox: OFF");
}
if ([gNatural state] == NSOnState) {
    NSLog(@"G Natural checkbox: ON");
}
else {
    NSLog(@"G Natural checkbox: OFF");
}
if ([aFlat state] == NSOnState) {
    NSLog(@"A Flat checkbox: ON");
}
else {
    NSLog(@"A Flat checkbox: OFF");
}   
if ([aNatural state] == NSOnState) {
    NSLog(@"A Natural checkbox: ON");
}
else {
    NSLog(@"A Natural checkbox: OFF");
}
if ([bFlat state] == NSOnState) {
    NSLog(@"B Flat checkbox: ON");
}
else {
    NSLog(@"B Flat checkbox: OFF");
}
if ([bNatural state] == NSOnState) {
    NSLog(@"B Natural checkbox: ON");
}
else {
    NSLog(@"B Natural checkbox: OFF");
}

}

- (void)drawRect:(NSRect)rect {

if ([cNatural state] == NSOnState) {
    NSLog(@"C Natural Selected");
    NSPoint cNaturalPos;
    cNaturalPos = NSMakePoint(35, 0);
    NSImage * cNaturalImage;
    cNaturalImage = [NSImage imageNamed:@"cNatural.png"];
    [cNaturalImage dissolveToPoint:cNaturalPos fraction:(1.0)];}
else 

    if ([dFlat state] == NSOnState) {
        NSPoint dFlatPos;
        dFlatPos = NSMakePoint(35, 0);
        NSImage * dFlatImage;
        dFlatImage = [NSImage imageNamed:@"cSharp.png"];
        [dFlatImage dissolveToPoint:dFlatPos fraction:(1.0)];}
    else 
        if ([dNatural state] == NSOnState) {
            NSPoint dNaturalPos;
            dNaturalPos = NSMakePoint(35, 0);
            NSImage * dNaturalImage;
            dNaturalImage = [NSImage imageNamed:@"dNatural.png"];
            [dNaturalImage dissolveToPoint:dNaturalPos fraction:(1.0)];}
        else 
            if ([eFlat state] == NSOnState) {
                NSPoint eFlatPos;
                eFlatPos = NSMakePoint(35, 0);
                NSImage * eFlatImage;
                eFlatImage = [NSImage imageNamed:@"eFlat.png"];
                [eFlatImage dissolveToPoint:eFlatPos fraction:(1.0)];}
            else 
                if ([eNatural state] == NSOnState) {
                    NSPoint eNaturalPos;
                    eNaturalPos = NSMakePoint(35, 0);
                    NSImage * eNaturalImage;
                    eNaturalImage = [NSImage imageNamed:@"eNatural.png"];
                    [eNaturalImage dissolveToPoint:eNaturalPos fraction:(1.0)];}
                else 
                    if ([fNatural state] == NSOnState) {
                        NSPoint fNaturalPos;
                        fNaturalPos = NSMakePoint(35, 0);
                        NSImage * fNaturalImage;
                        fNaturalImage = [NSImage imageNamed:@"fNatural.png"];
                        [fNaturalImage dissolveToPoint:fNaturalPos fraction:(1.0)];}
                    else  
                        if ([gFlat state] == NSOnState) {
                            NSPoint fSharpPos;
                            fSharpPos = NSMakePoint(35, 0);
                            NSImage * fSharpImage;
                            fSharpImage = [NSImage imageNamed:@"fSharp.png"];
                            [fSharpImage dissolveToPoint:fSharpPos fraction:(1.0)];}
                        else 
                            if ([gNatural state] == NSOnState) {
                                NSPoint gNaturalPos;
                                gNaturalPos = NSMakePoint(35, 0);
                                NSImage * gNaturalImage;
                                gNaturalImage = [NSImage imageNamed:@"gNatural.png"];
                                [gNaturalImage dissolveToPoint:gNaturalPos fraction:(1.0)];}
                            else  
                                if ([aFlat state] == NSOnState) {
                                    NSPoint aFlatPos;
                                    aFlatPos = NSMakePoint(35, 0);
                                    NSImage * aFlatImage;
                                    aFlatImage = [NSImage imageNamed:@"aFlat.png"];
                                    [aFlatImage dissolveToPoint:aFlatPos fraction:(1.0)];}
                                else  
                                    if ([aNatural state] == NSOnState) {
                                        NSPoint aNaturalPos;
                                        aNaturalPos = NSMakePoint(35, 0);
                                        NSImage * aNaturalImage;
                                        aNaturalImage = [NSImage imageNamed:@"aNatural.png"];
                                        [aNaturalImage dissolveToPoint:aNaturalPos fraction:(1.0)];}
                                    else  
                                        if ([bFlat state] == NSOnState) {
                                            NSPoint bFlatPos;
                                            bFlatPos = NSMakePoint(35, 0);
                                            NSImage * bFlatImage;
                                            bFlatImage = [NSImage imageNamed:@"bFlat.png"];
                                            [bFlatImage dissolveToPoint:bFlatPos fraction:(1.0)];}
                                        else 
                                            if ([bNatural state] == NSOnState) {
                                                NSPoint bNaturalPos;
                                                bNaturalPos = NSMakePoint(35, 0);
                                                NSImage * bNaturalImage;
                                                bNaturalImage = [NSImage imageNamed:@"bNatural.png"];
                                                [bNaturalImage dissolveToPoint:bNaturalPos fraction:(1.0)];}
                                            else {
                                                NSLog(@"No First Note Selection.");
                                                NSPoint emptyStaffPos;
                                                emptyStaffPos = NSMakePoint(35, 0);
                                                NSImage * emptyStaffImage;
                                                emptyStaffImage = [NSImage imageNamed:@"emptyStaff.png"];
                                                [emptyStaffImage dissolveToPoint:emptyStaffPos fraction:(1.0)];}



if ([dFlat state] == NSOnState) {
    NSPoint dFlatPos;
    dFlatPos = NSMakePoint(70, 0);
    NSImage * dFlatImage;
    dFlatImage = [NSImage imageNamed:@"cSharp.png"];
    [dFlatImage dissolveToPoint:dFlatPos fraction:(1.0)];}
else 
    if ([dNatural state] == NSOnState) {
        NSPoint dNaturalPos;
        dNaturalPos = NSMakePoint(70, 0);
        NSImage * dNaturalImage;
        dNaturalImage = [NSImage imageNamed:@"dNatural.png"];
        [dNaturalImage dissolveToPoint:dNaturalPos fraction:(1.0)];}
    else 
        if ([eFlat state] == NSOnState) {
            NSPoint eFlatPos;
            eFlatPos = NSMakePoint(70, 0);
            NSImage * eFlatImage;
            eFlatImage = [NSImage imageNamed:@"eFlat.png"];
            [eFlatImage dissolveToPoint:eFlatPos fraction:(1.0)];}
        else 
            if ([eNatural state] == NSOnState) {
                NSPoint eNaturalPos;
                eNaturalPos = NSMakePoint(70, 0);
                NSImage * eNaturalImage;
                eNaturalImage = [NSImage imageNamed:@"eNatural.png"];
                [eNaturalImage dissolveToPoint:eNaturalPos fraction:(1.0)];}
            else 
                if ([fNatural state] == NSOnState) {
                    NSPoint fNaturalPos;
                    fNaturalPos = NSMakePoint(70, 0);
                    NSImage * fNaturalImage;
                    fNaturalImage = [NSImage imageNamed:@"fNatural.png"];
                    [fNaturalImage dissolveToPoint:fNaturalPos fraction:(1.0)];}
                else 
                    if ([gFlat state] == NSOnState) {
                        NSPoint fSharpPos;
                        fSharpPos = NSMakePoint(70, 0);
                        NSImage * fSharpImage;
                        fSharpImage = [NSImage imageNamed:@"fSharp.png"];
                        [fSharpImage dissolveToPoint:fSharpPos fraction:(1.0)];}
                    else 
                        if ([gNatural state] == NSOnState) {
                            NSPoint gNaturalPos;
                            gNaturalPos = NSMakePoint(70, 0);
                            NSImage * gNaturalImage;
                            gNaturalImage = [NSImage imageNamed:@"gNatural.png"];
                            [gNaturalImage dissolveToPoint:gNaturalPos fraction:(1.0)];}
                        else 
                            if ([aFlat state] == NSOnState) {
                                NSPoint aFlatPos;
                                aFlatPos = NSMakePoint(70, 0);
                                NSImage * aFlatImage;
                                aFlatImage = [NSImage imageNamed:@"aFlat.png"];
                                [aFlatImage dissolveToPoint:aFlatPos fraction:(1.0)];}
                            else 
                                if ([aNatural state] == NSOnState) {
                                    NSPoint aNaturalPos;
                                    aNaturalPos = NSMakePoint(70, 0);
                                    NSImage * aNaturalImage;
                                    aNaturalImage = [NSImage imageNamed:@"aNatural.png"];
                                    [aNaturalImage dissolveToPoint:aNaturalPos fraction:(1.0)];}
                                else 
                                    if ([bFlat state] == NSOnState) {
                                        NSPoint bFlatPos;
                                        bFlatPos = NSMakePoint(70, 0);
                                        NSImage * bFlatImage;
                                        bFlatImage = [NSImage imageNamed:@"bFlat.png"];
                                        [bFlatImage dissolveToPoint:bFlatPos fraction:(1.0)];}
                                    else 
                                        if ([bNatural state] == NSOnState) {
                                            NSPoint bNaturalPos;
                                            bNaturalPos = NSMakePoint(70, 0);
                                            NSImage * bNaturalImage;
                                            bNaturalImage = [NSImage imageNamed:@"bNatural.png"];
                                            [bNaturalImage dissolveToPoint:bNaturalPos fraction:(1.0)];}
                                        else {
                                            NSPoint emptyStaffPos;
                                            emptyStaffPos = NSMakePoint(70, 0);
                                            NSImage * emptyStaffImage;
                                            emptyStaffImage = [NSImage imageNamed:@"emptyStaff.png"];
                                            [emptyStaffImage dissolveToPoint:emptyStaffPos fraction:(1.0)];}


if ([dNatural state] == NSOnState) {
    NSPoint dNaturalPos;
    dNaturalPos = NSMakePoint(105, 0);
    NSImage * dNaturalImage;
    dNaturalImage = [NSImage imageNamed:@"dNatural.png"];
    [dNaturalImage dissolveToPoint:dNaturalPos fraction:(1.0)];}
else 
    if ([eFlat state] == NSOnState) {
        NSPoint eFlatPos;
        eFlatPos = NSMakePoint(105, 0);
        NSImage * eFlatImage;
        eFlatImage = [NSImage imageNamed:@"eFlat.png"];
        [eFlatImage dissolveToPoint:eFlatPos fraction:(1.0)];}
    else 
        if ([eNatural state] == NSOnState) {
            NSPoint eNaturalPos;
            eNaturalPos = NSMakePoint(105, 0);
            NSImage * eNaturalImage;
            eNaturalImage = [NSImage imageNamed:@"eNatural.png"];
            [eNaturalImage dissolveToPoint:eNaturalPos fraction:(1.0)];}
        else 
            if ([fNatural state] == NSOnState) {
                NSPoint fNaturalPos;
                fNaturalPos = NSMakePoint(105, 0);
                NSImage * fNaturalImage;
                fNaturalImage = [NSImage imageNamed:@"fNatural.png"];
                [fNaturalImage dissolveToPoint:fNaturalPos fraction:(1.0)];}
            else 
                if ([gFlat state] == NSOnState) {
                    NSPoint fSharpPos;
                    fSharpPos = NSMakePoint(105, 0);
                    NSImage * fSharpImage;
                    fSharpImage = [NSImage imageNamed:@"fSharp.png"];
                    [fSharpImage dissolveToPoint:fSharpPos fraction:(1.0)];}
                else 
                    if ([gNatural state] == NSOnState) {
                        NSPoint gNaturalPos;
                        gNaturalPos = NSMakePoint(105, 0);
                        NSImage * gNaturalImage;
                        gNaturalImage = [NSImage imageNamed:@"gNatural.png"];
                        [gNaturalImage dissolveToPoint:gNaturalPos fraction:(1.0)];}
                    else 
                        if ([aFlat state] == NSOnState) {
                            NSPoint aFlatPos;
                            aFlatPos = NSMakePoint(105, 0);
                            NSImage * aFlatImage;
                            aFlatImage = [NSImage imageNamed:@"aFlat.png"];
                            [aFlatImage dissolveToPoint:aFlatPos fraction:(1.0)];}
                        else 
                            if ([aNatural state] == NSOnState) {
                                NSPoint aNaturalPos;
                                aNaturalPos = NSMakePoint(105, 0);
                                NSImage * aNaturalImage;
                                aNaturalImage = [NSImage imageNamed:@"aNatural.png"];
                                [aNaturalImage dissolveToPoint:aNaturalPos fraction:(1.0)];}
                            else 
                                if ([bFlat state] == NSOnState) {
                                    NSPoint bFlatPos;
                                    bFlatPos = NSMakePoint(105, 0);
                                    NSImage * bFlatImage;
                                    bFlatImage = [NSImage imageNamed:@"bFlat.png"];
                                    [bFlatImage dissolveToPoint:bFlatPos fraction:(1.0)];}
                                else 
                                    if ([bNatural state] == NSOnState) {
                                        NSPoint bNaturalPos;
                                        bNaturalPos = NSMakePoint(105, 0);
                                        NSImage * bNaturalImage;
                                        bNaturalImage = [NSImage imageNamed:@"bNatural.png"];
                                        [bNaturalImage dissolveToPoint:bNaturalPos fraction:(1.0)];}
                                    else {
                                        NSPoint emptyStaffPos;
                                        emptyStaffPos = NSMakePoint(105, 0);
                                        NSImage * emptyStaffImage;
                                        emptyStaffImage = [NSImage imageNamed:@"emptyStaff.png"];
                                        [emptyStaffImage dissolveToPoint:emptyStaffPos fraction:(1.0)];}

NSLog(@"Redisplayed.");
NSPoint clefPos;
clefPos = NSMakePoint(0, 0);
NSImage * clefImage;
clefImage = [NSImage imageNamed:@"clefStart.png"];
[clefImage dissolveToPoint:clefPos fraction:(1.0)];


}   

@end
Run Code Online (Sandbox Code Playgroud)

War*_*ton 6

当您将视图视为模型时,这不是一种特别好的方法.如果您还没有,请阅读模型视图控制器(MVC)模式.

我会有一个每个开关的布尔NSUserDefault或一个obj-c属性,具体取决于你想要的持久性.

因此,用你的开关烹饪你的XIB,然后将切换器的值绑定到你的属性,将它从检查器左边的第4个和两个绿色blob绑定.

    @class FooController : NSObject
    {

    BOOL switch1;
    BOOL switch2;

    }

@property (readwrite,assign) BOOL switch1;
@property (readwrite,assign) BOOL switch2;
Run Code Online (Sandbox Code Playgroud)

然后假设这是NIB的所有者对象

@class FooController

@synthesise switch1,switch2;

-(void)awakeFromNib
{

self.switch1 = YES; //switch1 starts on 
self.switch2 = NO; //switch2 starts off


[self addObserver:self forKeyPath:@"switch1" options:0 context:NULL];
[self addObserver:self forKeyPath:@"switch2" options:0 context:NULL];


}

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                    change:(NSDictionary *)change
                       context:(void *)context
{
if([keyPath isEqualToString:@"switch1"]) { //do things related to switch1 }
else if ([keyPath isEqualToString:@"switch2"]) { //do things related to switch2 }
etc...
}

@end
Run Code Online (Sandbox Code Playgroud)

自我观察自我看起来有点奇怪,但这意味着当你在接口中改变绑定到相应属性的开关时你会了解它.而且你没有写出一大堆get/set方法.

使用此方法可以同样观察NSUserDefaults对象

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self 
                                                          forKeyPath:@"switch1" 
                                                             options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 
                                                             context:NULL];
Run Code Online (Sandbox Code Playgroud)

模型上的值的任何更改都会反映在视图中,并且观察协议中会记录视图中的任何更改

查看此文档http://developer.apple.com/library/mac/documentation/cocoa/conceptual/KeyValueObserving/


Pet*_*sey 5

除了使您的复选框反映控制器拥有的布尔值,而不是自己拥有这些值,并将此逻辑移动到控制器之外,您还应该烧掉大部分复制粘贴的代码.

看起来你对每种情况做同样的事情,只是真正改变图像,所以对所有情况使用相同的position变量(具有相同的值)和相同的image变量.

废除这些if陈述.在IB中设置复选框的标签,并在控制器的操作方法中选中复选框,使用发件人的标签来确定要显示的图像.(无论是使用数组还是字典执行此操作都取决于您,但您必须提前设置它,例如以init任何方式设置它.)

您可能希望生成包含图像名称数组或字典的plist文件,并在您的init方法中加载它.您可以使用另一种方法尝试从带有标记号作为键的字典中检索NSImage,如果该标记不在该字典中,则使用标记到名称字典(来自plist文件)来获取图像名称,使用该名称加载图像,并将图像存储在标记到图像字典中以供将来检索.单击复选框时,您将调用此方法,传递复选框的标记,并将其返回的图像切换到您要显示的自定义视图.

如果您的目标是Snow Leopard,则可以使用NSCache而不是NSMutableDictionary进行标记到图像的映射.这使您可以设置一次加载的图像数量限制.

顺便说一句,dissolveToPoint:fraction:自Snow Leopard以来就被弃用了.你应该使用drawAtPoint:fromRect:operation:fraction:.传递NSZeroRect源矩形以使用整个图像.

此外,如果您确实意味着用户一次只能选择一个图像,则应使用单选按钮,而不是复选框.将其实现为包含NSButtonCells的NSMatrix; 最简单的方法是创建一个单选按钮,然后在IB中选择调整大小.单元格是你应该设置的标签和动作.仅当用户可以选择以某种方式组合的多个图像(例如,将它们合成在一起)时,复选框才是合适的.