1

ユーザーがチェックボックスをクリックすると、ボックスに画像が表示されるインターフェイスを設計しようとしていNSViewます。12個のチェックボックスがあり、チェックボックスのさまざまな組み合わせをすべて処理するためのifelseステートメントのレイアウトが...頭の中にあります。宣言内にifelseステートメントを配置しました-(void)drawRect:(NSRect)rectが、機能していないようです。(エラーは発生しません)。プログラムが最初に開始されたときに、ifelseステートメントが正しく評価されることがわかりました。しかし、「」を含むアクションをアクティブにするチェックボックスをクリックするとsetNeedsDisplay:、「ifelse」ステートメントは再評価されません。(もちろん、それは私がどのように機能するかを正確に理解していないことを意味しますsetNeedsDisplay:。笑)

NSLog何が起こっているのかを確認するために、さまざまな場所にいくつかのステートメントを配置しました。-(void)drawRect宣言に、が機能していることを確認するための1つがありsetNeedsDisplay:ます。そしてそうだった。チェックボックスをクリックするたびに、setNeedsDisplayがアクティブになります。また、「if else」ステートメントの2つの場所に次のように配置NSLogします。最初の部分に1つ:

- (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
          ......................

そして、「ifelse」条件の最初のセットの最後に1つあります。

        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)];}

プログラムが最初にロードされたときに、「最初のノートの選択なし」がコンソールに表示されると思います。そして、そうです。「cNatural」チェックボックスをアクティブにすると、代わりにコンソールに「NoFirstNoteSelection」文字列が表示されます。チェックボックスの状態変化を登録していないようです。

Interface Builderでチェックボックスが正しく接続されていることを確認するために、チェックボックスが切り替えられたときにアクティブになるこのコード行を作成しました:(このコードには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");
}

これらはすべてコンソールで期待どおりに表示されますが、-(void)drawRect一部の「ifelse」ステートメントは登録されていないようです。

私はいたるところを見てきましたが、これに対する解決策を見つけることができません。どんな助けでも大歓迎です。

これが私の.mファイルのかなり長いコードです:

#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
4

2 に答える 2

6

ビューをモデルとして扱っているため、これはこれにアプローチするための特に良い方法ではありません。まだ読んでいない場合は、Model View Controller(MVC)パターンについてお読みください。

これをどの程度永続化するかに応じて、スイッチごとにブール値のNSUserDefaultまたはobj-cプロパティのいずれかを使用します。

したがって、スイッチを使用してXIBを作成し、スイッチの値をプロパティにバインドします(インスペクターの左から4番目に2つの緑がかったブロブがあります)。

    @class FooController : NSObject
    {

    BOOL switch1;
    BOOL switch2;

    }

@property (readwrite,assign) BOOL switch1;
@property (readwrite,assign) BOOL switch2;

次に、これが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

自己観察する自己のことは少し奇妙に見えますが、対応するプロパティにバインドされたスイッチがインターフェイスで変更されると、それについて知ることができます。そして、あなたはget/setメソッドの小屋の負荷を書いていません。

NSUserDefaultsオブジェクトは、このメソッドでも同様に監視できます

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

モデルの値の変更はビューに反映され、ビューの変更は観測プロトコルに記録されます

このドキュメントをチェックしてくださいhttp://developer.apple.com/library/mac/documentation/cocoa/conceptual/KeyValueObserving/

于 2011-02-14T22:58:35.193 に答える
5

チェックボックスに、コントローラーが所有するブール値を反映させるだけでなく、それらの値自体を所有するのではなく、このロジックをコントローラーに移動するだけでなく、コピーして貼り付けたコードのほとんどを焼き払う必要があります。

すべてのケースで同じことをしているように見えますが、実際には画像が異なるだけなので、すべてのケースで同じposition変数(同じ値)と同じimage変数を使用してください。

ifステートメントを廃止します。IBでチェックボックスのタグを設定し、チェックボックスに対するコントローラーのアクションメソッドで、送信者のタグを使用して、表示する画像を決定します。init(これを配列で行うか辞書で行うかはあなた次第ですが、どちらの方法でも、事前に設定する必要があります。)

画像名の配列または辞書を含むplistファイルを作成し、それをinitメソッドにロードすることをお勧めします。タグ番号をキーとして辞書からNSImageを取得しようとする別の方法があり、タグがその辞書にない場合は、(plistファイルからの)tags-to-names辞書を使用して画像名を取得します。 、その名前を使用して画像をロードし、将来の検索のために画像をtags-to-imagesディクショナリに保存します。チェックボックスがクリックされたときにこのメソッドを呼び出し、チェックボックスのタグを渡し、表示するカスタムビューに戻る画像を渡します。

Snow Leopardをターゲットにしている場合は、タグからイメージへのマッピングにNSMutableDictionaryの代わりにNSCacheを使用できます。これにより、一度にロードし続ける画像の数に制限を設定できます。

ちなみに、dissolveToPoint:fraction:SnowLeopard以降は非推奨です。drawAtPoint:fromRect:operation:fraction:代わりに使用する必要があります。NSZeroRect画像全体を使用するには、ソースの長方形を渡します。

また、ユーザーが一度に1つの画像しか選択できないようにする場合は、チェックボックスではなくラジオボタンを使用する必要があります。NSButtonCellsを含むNSMatrixとして実装します。最も簡単な方法は、単一のラジオボタンを作成してから、IBでオプションのサイズを変更することです。セルは、タグとアクションを設定する必要があるものです。チェックボックスは、ユーザーが何らかの方法で組み合わせる(たとえば、それらを一緒に合成する)複数の画像を選択できる場合にのみ適切です。

于 2011-02-15T01:03:12.773 に答える