2013-04-29 2 views
2

EDIT: Ребята, вы так здорово, спасибо за все ответы. Я решил пойти по пути stringByAppendingString, потому что он кажется самым простым, но по какой-то причине он не будет работать! Пожалуйста, извините меня, если это слишком noobish. Большое спасибо за поддержку!Как отслеживать порядок нажатия кнопок?

Вот кусок кода:

#import "ViewController.h" 
    @interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self setupGame]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
    int finalorder = 12; 
- (IBAction)buttonPressed: (UIButton*) button { 
    if (button.tag == 1) 
    { 
     int order = 1; 
    } 
    if (button.tag == 2) 
    { 
     [order stringByAppendingString:@"2"]; 
    } 
    if ([order isEqualToString:finalorder]) 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Wrong!" 
          message:[NSString stringWithFormat:@"Try again!"] 
          delegate:self 
          cancelButtonTitle:@"Try" 
          otherButtonTitles:nil]; 
     [alert show]; 
           }; 

    } 

// Оригинал quesiton: Мне очень жаль, так как я полный нуб и это нуб вопрос.

Я делаю свое первое приложение для iPhone, и я хочу, чтобы он был тренером по шкале - для людей, изучающих музыкальные шкалы. На экране есть одна октава фортепиано (12 кнопок, по одной для каждой клавиши), и я хочу, чтобы программа отслеживала порядок, в котором пользователь нажимает кнопки, чтобы узнать, помнит ли он порядок ключей в особый масштаб. Например, мы находимся в масштабе C, есть ключи: C, D, E, F, G, A, B. Если пользователь нажимает C, а затем D, он работает дальше. Но если пользователь нажимает C, а затем C#, должно появиться предупреждение: «Неверно! Попробуйте еще раз».

Кроме того, я хочу, чтобы имя каждой клавиши просматривалось в метке: если пользователь нажимает клавишу C, есть C и т. Д.

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

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self setupGame]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
- (IBAction)buttonPressed: (UIButton*) button { 

    if (button.tag == 1) 
    { 
     waitinglabel.text = @"C"; 
    } 
    else 
    { 
    [timer invalidate]; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Wrong!" 
       message:[NSString stringWithFormat:@"Try again!"] 
       delegate:self 
       cancelButtonTitle:@"Try" 
       otherButtonTitles:nil]; 
    [alert show]; 
    } 
    if (button.tag == 2) 
    { 
     waitinglabel.text = @"C#"; 
    } 

    if (button.tag == 3) 
    { 
     waitinglabel.text = @"D"; 
    } 


    if (button.tag == 4) 
    { 
     waitinglabel.text = @"D#"; 
    } 

    if (button.tag == 5) 
    { 
     waitinglabel.text = @"E"; 
    } 

    if (button.tag == 6) 
    { 
     waitinglabel.text = @"F"; 
    } 

    if (button.tag == 7) 
    { 
     waitinglabel.text = @"F#"; 
    } 

    if (button.tag == 8) 
    { 
     waitinglabel.text = @"G"; 
    } 

    if (button.tag == 9) 
    { 
     waitinglabel.text = @"G#"; 
    } 

    if (button.tag == 10) 
    { 
     waitinglabel.text = @"A"; 
    } 

    if (button.tag == 11) 
    { 
     waitinglabel.text = @"A#"; 
    } 

    if (button.tag == 12) 
    { 
     waitinglabel.text = @"B"; 
    } 
} 

- (void)setupGame { 
    seconds = 30; 
    count = 0; 

    timerlabel.text = [NSString stringWithFormat:@"Time: %i", seconds]; 

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f 
              target:self 
              selector:@selector(subtractTime) 
              userInfo:nil 
              repeats:YES]; 
} 

- (void)subtractTime { 
    seconds--; 
    timerlabel.text = [NSString stringWithFormat:@"Time: %i",seconds]; 

    if (seconds == 0) { 
     [timer invalidate]; 
    } 
} 

@end 
+1

Отметьте ответ, который помог вам принять. Кроме того, обычно нехорошо менять свой вопрос на новый вопрос о последующих действиях. – memmons

+0

Мне очень жаль! В следующий раз обязательно последуют правилам. – Automatika

ответ

1

Я предлагаю вам сделать NSString вашей кнопку пресс-конференции ,

Как у вас есть finalOrder является ABCD затем

NSString *order; 

1stButtonPress -> [email protected]"A"; 
2ndButtonPress -> [order stringByAppendingString:@"B"]; 
3rdButtonPress -> [order stringByAppendingString:@"C"]; 
4thButtonPress -> [order stringByAppendingString:@"D"]; 

Не соответствует этому

if ([order isEqualToString:finalOrder]) 
    { 
     //Your Work 
    } 
    else{ 
     //invalid format 
    } 

EDIT

По вашему вопросу заменить int с NSString т.е.

NSString *finalorder = @12"; 
NSString *order = @"1"; 
+0

Спасибо большое! Я решил так, но все равно не могу это решить. Пожалуйста, взгляните на отредактированный вопрос выше. Благодаря! – Automatika

+0

Посмотрите также на отредактированный ответ .. :) – Rajneesh071

+0

Большое спасибо. Будете ли вы так любезны прокомментировать немного более подробно о том, какую конструкцию вы подразумеваете под «1stButtonPress»? Может быть, пример того, что вы там напишете. Извините, если это слишком noobish и много спасибо заранее за вашу любезную помощь! – Automatika

2

Я хотел бы использовать NSMutableArray и каждый раз, когда нажимается кнопка, просто добавьте тег кнопки на массив.

[yourArray addObject:[NSNumber numberWithInteger:button.tag]]; 

В файле .h определяют следующим образом:

@property(nonatomic,strong) NSMutableArray *buttonTapArray; 

в вашем setUpGame сделать это:

self.buttonTapArray = [[NSMutableArray alloc] init]; 

, а затем в вашей buttonPress функции просто добавьте первый фрагмент

[self.buttonTapArray addObject:[NSNumber numberWithInteger:button.tag]]; 

изменить порядок, просто переинициализировать массив, делая другой

self.buttonTapArray = [[NSMutableArray alloc] init]; 
+1

Разве это не '[yourArray addObject: [NSString stringWithFormat: @"% d ", button.tag]];' или '[yourArray addObject: [NSNumber numberWithInteger: button.tag]];' правильный путь? Поскольку integer не является объектом. – h4cky

+0

Спасибо @ h4cky за указание на это. Конечно, вы правы :-) – gasparuff

2

У вас есть предопределенный набор музыкальных нот. Сначала нужно создать уникальную нотацию для каждой заметки. Создайте массив всех заметок.

Каждая нота будет иметь следующую информацию

[ 
    { 
    "Tag":1, 
    "Name":"C", 
    "Info":{} 
    }, 
    { 
    "Tag":2, 
    "Name":"C#", 
    "Info":{} 
    } 
] 

Создавая массив, как это вы можете удалить сравнение тегов в вашем buttonPressed: метод. Вам нужно назначить тег примечания соответствующей кнопке. Когда нажата кнопка с помощью тега кнопки, вы можете узнать, какая нота была нажата.

Затем вы можете сформировать действительный порядок, в котором создается шкала с использованием этих заметок.

Шкала C = [1,3,5,6,8,10,12];

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

1

Для изучения последовательности нажатий вы можете использовать:

создать переменный класс:

NSMutableArray *_requiredSequence = [@[@"C", @"D", @"E", @"F", @"G", @"A", @"B" ] mutableCopy]; 

И потом:

- (IBAction)buttonPressed: (UIButton*) button { 
    NSString *pressedNote = [self noteNameForButtonWithTag:button.tag]; 
    NSString *requiredNote = _requiredSequence[0]; 

    if ([pressedNote caseInsensitiveCompare:requiredNote] == NSOrderedSame]) { 
     waitinglabel.text = pressedNote; 
     [array removeObjectAtIndex:0]; 
     if ([array count] == 0) { 
      //finish 
     } 
    } else { 
     //show alert 
    } 
} 

- (NSString *)noteNameForButtonWithTag:(NSUInteger)tag { 
    static NSArray *noteNames = @[@"C", @"C#", @"D", @"D#", ....]; 
    NSUInteger index = tag - 1; 
    return scaleNames[index]; 
} 
0

Я хотел бы использовать NSString, чтобы сохранить последовательность нажатых весов. Используйте метод stringByAppendingString для добавления в последовательность и rangeOfString, чтобы проверить, является ли прессованная последовательность подмножеством правильного порядка шкал

+0

Спасибо большое! Я решил так, но все равно не могу это решить. Пожалуйста, взгляните на отредактированный вопрос выше. Благодаря! – Automatika

Смежные вопросы