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)
当您将视图视为模型时,这不是一种特别好的方法.如果您还没有,请阅读模型视图控制器(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/
除了使您的复选框反映控制器拥有的布尔值,而不是自己拥有这些值,并将此逻辑移动到控制器之外,您还应该烧掉大部分复制粘贴的代码.
看起来你对每种情况做同样的事情,只是真正改变图像,所以对所有情况使用相同的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中选择调整大小.单元格是你应该设置的标签和动作.仅当用户可以选择以某种方式组合的多个图像(例如,将它们合成在一起)时,复选框才是合适的.