Хорошо, это будет глупый вопрос, но в любом случае мне некуда его задать, кроме как здесь.
У меня есть две кнопки, и при нажатии на любую из них должен выполняться оператор 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
Конечно, этот код неверен, но это просто план того, что я хотел получить.
Вопросов:
- Как правильно использовать такой оператор switch-case в качестве отдельного метода, чтобы я мог вызывать его из методов IBAction?
- Как мне привести типы данных, чтобы этот код работал, или лучше везде использовать целочисленный тип (для «текущей» переменной)?
2 ответа
У меня действительно нет вашего вопроса, но, возможно, вам следует переключаться между прямым и обратным случаями, используя такой метод:
- (IBAction)pressButton:(id) sender;
И в зависимости от значения отправителя вы можете переключать регистр между Forward и Backward. Таким образом, ваш код, возможно, будет более читабельным, и вам не придется дублировать свой переключатель.
N.B. : Если ваша единственная проблема - это дублирование вашего переключателя, и если вы не хотите использовать мой метод, я не понимаю, почему вы не вызываете напрямую свой switchMethod в двух функциях ...
Ответ на вопрос 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]...
Др
Похожие вопросы
Новые вопросы
iphone
НЕ ИСПОЛЬЗУЙТЕ этот тег, если вы не обращаетесь конкретно к iPhone и / или iPod touch от Apple. Для вопросов, не зависящих от оборудования, используйте тег [ios]. Больше тегов, которые нужно рассмотреть, это [xcode] (но только если вопрос касается самой IDE), [swift], [target-c] или [cocoa-touch] (но не [cocoa]). Пожалуйста, воздержитесь от вопросов, касающихся iTunes App Store или iTunes Connect. Если вы используете C #, пометьте [mono].