Хорошо, это будет глупый вопрос, но в любом случае мне некуда его задать, кроме как здесь.

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

Я попытался выделить swith-case в отдельный метод, и вот что у меня есть:

файл .h

#import <UIKit/UIKit.h>

@interface AppViewController : UIViewController
{
    IBOutlet UILabel *someTextLabel;
    NSNumber *current;
}

@property (nonatomic, retain) IBOutlet UILabel *someTextLabel;
@property (nonatomic, retain) NSNumber *current;

- (void) switchMethod;
- (IBAction) pressButtonForward;
- (IBAction) pressButtonBack;

@end

файл .m

#import "AppViewController.h"

@implementation AppViewController

@synthesize someTextLabel;
@synthesize current;

current = 0;

- (void) switchMethod:current
{
    switch((int)current) {   

        case 0:
        //do something
        break;

        case 1 :
        //do something
        break;

        //etc

        default:
        //do something
        break;
    }
}

- (IBAction) pressButtonBack 
{ 
    if((int)current == 0) {
        current = 6; 
    }
    else {
        current--;
    }
    //here must be a switchMethod performed
}

- (IBAction) pressButtonForward 
{
    if((int)current == 6) {
        current = 0;
    }
    else {
        current++;
    }
    //here must be a switchMethod performed
} 

//auto-generated code here

@end

Конечно, этот код неверен, но это просто план того, что я хотел получить.

Вопросов:

  1. Как правильно использовать такой оператор switch-case в качестве отдельного метода, чтобы я мог вызывать его из методов IBAction?
  2. Как мне привести типы данных, чтобы этот код работал, или лучше везде использовать целочисленный тип (для «текущей» переменной)?
0
nick130586 30 Июл 2010 в 14:43
Измените свой вопрос, включив в него актуальный вопрос.
 – 
Alex Reynolds
30 Июл 2010 в 14:58

2 ответа

Лучший ответ

У меня действительно нет вашего вопроса, но, возможно, вам следует переключаться между прямым и обратным случаями, используя такой метод:

- (IBAction)pressButton:(id) sender;

И в зависимости от значения отправителя вы можете переключать регистр между Forward и Backward. Таким образом, ваш код, возможно, будет более читабельным, и вам не придется дублировать свой переключатель.

N.B. : Если ваша единственная проблема - это дублирование вашего переключателя, и если вы не хотите использовать мой метод, я не понимаю, почему вы не вызываете напрямую свой switchMethod в двух функциях ...

2
ThR37 30 Июл 2010 в 15:18
Вы можете увидеть, какая кнопка была нажата, сравнив значение тега кнопки (которое вы можете назначить в IB): UIButton * button = (UIButton *) sender; if (button.tag == 0) {...
 – 
chilitechno.com
30 Июл 2010 в 15:54
Да, моя проблема - дублирование переключателя. Я просто не знаю, как правильно вызвать switchMethod. Я пробовал [self.switchMethod: (int) current], но это вызывает ошибку «Значение Void не игнорируется, поскольку оно должно быть».
 – 
nick130586
30 Июл 2010 в 16:06
В последнее время я мало использовал Objective-C, но я бы использовал следующий синтаксис: [self switchMethod: [current intValue]] (используйте пробел вместо точки! Мы не в python)
 – 
ThR37
30 Июл 2010 в 16:11
Спасибо, [self switchMethod: current] работает нормально. Я изменил NSNumber на int. Спасибо.
 – 
nick130586
30 Июл 2010 в 16:19
Я использовал "." вместо пробела, потому что раньше я использовал self.view.doSomething и подумал, что это будет правильно и для пользовательских методов.
 – 
nick130586
30 Июл 2010 в 16:23

Ответ на вопрос 1:

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

Ответ на вопрос 2:

NSNumber - это объект, содержащий числовое значение. Чтобы преобразовать NSNumber в int:

int myIntValue = [number intValue];

Чтобы преобразовать int в NSNumber

NSNumber* number = [NSNumber numberWithInt: myIntValue];

Однако в вашем примере лучше просто определить current как int. Итак, ваш код должен выглядеть примерно так:

@interface AppViewController : UIViewController
{
    IBOutlet UILabel *someTextLabel;
    unsigned int current;
}

@property (nonatomic, retain) IBOutlet UILabel *someTextLabel;
@property (nonatomic, assign) unsigned int current; // nonatomic might be redundant for POD types 

- (void) switchMethod;
- (IBAction) pressButtonForward;
- (IBAction) pressButtonBack;

@end

@implementation AppViewController

@synthesize someTextLabel;
@synthesize current;

//current = 0;  this wouldn't compile, in any case it is redundant, ivars start out as 0.

- (void) switchMethod
{
    switch(current) 
    {   
        // do switchy stuff
    }
}

- (IBAction) pressButtonBack 
{ 
    if(current == 0) 
    {
        current = 6; 
    }
    else 
    {
        current--;
    }
    [self switchMethod];
}

- (IBAction) pressButtonForward 
{
    if(current == 6) 
    {
        current = 0;
    }
    else 
    {
        current++;
    }
    [self switchMethod];
} 

// etc

@end

NB, хотя я определил свойство для тока, я не использовал его в коде, что немного запрещено. Основная проблема в том, что если кто-то решит наблюдать за течением с помощью KVO, он не будет уведомлен об изменениях. Я действительно должен был написать такие вещи, как

switch([self current])...

А также

[self setCurrent: 6]...

Др

0
JeremyP 30 Июл 2010 в 16:34