Цель-C: Использовать операторы «if else» внутри - (void) drawRect, чтобы получить состояние флажка? - PullRequest
1 голос
/ 15 февраля 2011

Я пытаюсь разработать интерфейс, в котором, когда пользователь нажимает на флажок, он отображает изображение в поле NSView.Есть 12 флажков, и у меня есть ... в моем представлении ... макет операторов if else для обработки всех различных комбинаций флажков.Я поместил оператор if else в декларации -(void)drawRect:(NSRect)rect, но они, похоже, не работают.(Я не получаю ошибки).Я понял, что он правильно оценивает операторы if else при первом запуске программы.Но когда я нажимаю флажок, который активирует действие, содержащее «setNeedsDisplay:», операторы «if else» не переоцениваются.(Что, конечно, означает, что я не совсем понимаю, как работает setNeedsDisplay: ..lol)

Я поместил пару NSLog утверждений в разных местах, чтобы увидеть, что происходит.У меня есть один в объявлении - (void) drawRect, чтобы убедиться, что setNeedsDisplay: работает.И это было.Всякий раз, когда я нажимаю флажок, он активирует setNeedsDisplay.Я поставил NSLog также в двух местах в своем выражении "если еще": один в первой части:

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

Я ожидаю, что при первой загрузке программы в моей консоли появится сообщение «No First Note Selection».И это так.Чего не происходит, когда я активирую флажок «cNatural», вместо этого он отображает строку «No First Note Selection» в консоли.Как будто он не регистрирует изменение состояния флажка.

Чтобы убедиться, что я правильно установил флажки в Интерфейсном Разработчике, я создал эту строку кода, которая активируется при переключении флажка: (Этот код также включает 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, похоже, просто не регистрируются.

Я искал везде и не могунайти решение для этого.Любая помощь будет высоко ценится.

Вот довольно длинный код для моего файла .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

Ответы [ 2 ]

6 голосов
/ 15 февраля 2011

Это не очень хороший способ приблизиться к этому, поскольку вы рассматриваете свой взгляд как модель.Прочтите о шаблоне Model View Controller (MVC), если вы этого еще не сделали.

У меня будет либо логическое NSUserDefault для каждого переключателя, либо свойство obj-c в зависимости от того, насколько постоянным вы хотите, чтобы это было.

Так что приготовьте XIB с вашими переключателями, а затем привяжите (это 4-й слева в инспекторе с двумя зеленоватыми каплями) значения переключателей к вашим свойствам.

    @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/

5 голосов
/ 15 февраля 2011

Помимо того, что ваши флажки отражают логические значения, которыми владеет ваш контроллер, а не сами эти значения, и перемещая эту логику в контроллер, вы также должны записать большую часть этого скопированного и вставленного кода.

Похоже, что вы делаете одно и то же для каждого случая, только изменяя изображение, поэтому используйте одну и ту же переменную position (с тем же значением) и одну и ту же переменную image для всех случаев.

Избавьтесь от if утверждений.Установите теги флажков в IB, и в методе действия вашего контроллера для флажков используйте тег отправителя, чтобы определить, какое изображение показывать.(Независимо от того, делаете ли вы это с массивом или словарем, вам решать, но вам придется настроить его заранее, например, в init, в любом случае.)

Возможно, вы захотитесоздайте файл plist, содержащий массив или словарь имен изображений, и загрузите его в свой метод init.У вас может быть другой метод, который пытается извлечь NSImage из словаря с номерами тегов в качестве ключей и, если тег отсутствует в этом словаре, использует словарь тегов к именам (из файла plist), чтобы получить имя изображениязагружает изображение с этим именем и сохраняет его в словаре тегов к изображениям для последующего поиска.Этот метод будет вызываться при нажатии на флажок, при передаче тега флажка и передаче изображения, которое он возвращает, для отображения в пользовательском представлении.

Если вы нацелены на Snow Leopard, вы можете использовать NSCache вместо NSMutableDictionary для сопоставления тегов и изображений.Это позволяет вам установить ограничение на количество загружаемых изображений за один раз.

Кстати, dissolveToPoint:fraction: устарело со времен Snow Leopard.Вы должны использовать drawAtPoint:fromRect:operation:fraction: вместо этого.Передайте NSZeroRect для исходного прямоугольника, чтобы использовать все изображение.

Кроме того, если вы действительно хотите, чтобы пользователь мог выбирать только одно изображение за раз, вы должны использовать переключатели, а не флажки,Реализуйте это как NSMatrix, содержащий NSButtonCells;Самый простой способ - создать одну радиокнопку, а затем изменить ее размер в IB.Клетки - это то, что вы должны установить теги и действия.Флажки будут уместны, только если пользователь может выбрать несколько изображений, которые будут каким-либо образом объединяться (например, комбинировать их вместе).

...