如何跟踪按钮按下的顺序?

时间:2013-04-29 15:21:49

标签: iphone ios objective-c

编辑: 伙计们,你真是太棒了,感谢所有的回复。 我已经决定使用stringByAppendingString路由,因为它似乎是最简单的,但它仍然无法正常工作!如果这太苛刻,请原谅我。 非常感谢所有的支持!

这是一段代码:

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

    }

//原始问题: 我很抱歉,因为我是一个完整的菜鸟,这是一个菜鸟问题。

我正在制作我的第一个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

5 个答案:

答案 0 :(得分: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 :(得分:2)

您有一组预定义的音符。您需要先为每个音符创建一个唯一的表示法。创建所有笔记的数组。

每个笔记都有以下信息

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

通过创建这样的数组,您可以在buttonPressed:方法中删除标记比较。您需要将注释的标签分配给相应的按钮。使用按钮的标签按下按钮时,您可以找到按下了哪个音符。

然后,您可以使用这些注释形成有效的订单。

比例C = [1,3,5,6,8,10,12];

您需要保留一个实例变量,该变量将跟踪用户输入的注释,每次按下按钮都会增加它。在使用此索引的每个事件时,检查存储在比例数组中的注释的标记。如果不匹配则发出警报。

答案 2 :(得分: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];
}

答案 3 :(得分:1)

我建议您按下按钮事件NSString

就像你finalOrder ABCD 那样

NSString *order;

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

与此不匹配

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

编辑

根据您的问题,将int替换为NSString,即

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

答案 4 :(得分:0)

我会使用NSString来存储按下的音阶序列。使用stringByAppendingString方法添加到序列,并使用rangeOfString检查按下的序列是否是正确的比例顺序的子集