Преобразование одноразового кода в метод - PullRequest
0 голосов
/ 31 марта 2012

У меня есть следующий код, который касается одной кнопки и рисует рамку вокруг этой кнопки, а затем следит за тем, чтобы все остальные кнопки не имели границы (всего 8 кнопок). Это метод в одноэлементном классе с именем AnswerButtons. Этот код отлично работает.

- (IBAction)button1WasTouched:(id)sender {

    NSLog(@"Hello from button 1");

    // retrieve, modify and update clueAnsState

    NSMutableArray *newCAS = [[GameData gameData].curData objectForKey:@"clueAnsState"];
   [newCAS replaceObjectAtIndex:0
                     withObject:@"2"];
    [[GameData gameData].curData setObject:newCAS
                                    forKey:@"clueAnsState"];

    // Highlight the pressed button & make sure other buttons are not highlighted

    for (NSInteger idx = 0; idx < 8; idx++) {
        NSString *temp = [newCAS objectAtIndex:idx];
        if ([temp isEqualToString:@"1"]) {
            UIButton *b = [[AnswerButtons answerButtons].buttons objectAtIndex:idx];
            [[b layer] setBorderWidth:0.0f];
        }
        if ([temp isEqualToString:@"2"]) {
            UIButton *b = [[AnswerButtons answerButtons].buttons objectAtIndex:idx];
            [[b layer] setBorderWidth:2.0f];
        }
    }

}

Теперь мне нужно использовать этот код для всех 8 кнопок, поэтому я должен написать метод с одним аргументом, номер кнопки для модификации (pos). В синглтон-класс .m я поставил практически тот же код:

    - (void)activateAnswerAtPos:(int)pos {

    // retrieve, modify and update clueAnsState

    NSMutableArray *newCAS = [[GameData gameData].curData objectForKey:@"clueAnsState"];
    [newCAS replaceObjectAtIndex:pos
                      withObject:@"2"];
    [[GameData gameData].curData setObject:newCAS
                                    forKey:@"clueAnsState"];

    NSLog(@"%@", newCAS);

    for (NSInteger idx = 0; idx < 8; idx++) {
        NSString *temp = [newCAS objectAtIndex:idx];
        if ([temp isEqualToString:@"1"]) {
            UIButton *b = [[AnswerButtons answerButtons].buttons objectAtIndex:idx];
            [[b layer] setBorderWidth:0.0f];
       }
       if ([temp isEqualToString:@"2"]) {
            UIButton *b = [[AnswerButtons answerButtons].buttons objectAtIndex:idx];
            [[b layer] setBorderWidth:2.0f];
        }
    }
}

Итак, я изменил первый фрагмент кода, чтобы сделать его вызовом нового метода:

- (IBAction)button1WasTouched:(id)sender {

    NSLog(@"Hello from button 1");
    [sender activateAnswerAtPos:0];
}

К сожалению, я что-то не так делаю, поскольку получаю следующее исключение:

2012-03-30 19:41:40.199 P3[6751:f803] Hello from button 1
2012-03-30 19:41:40.201 P3[6751:f803] -[UIRoundedRectButton activateAnswerAtPos:]: unrecognized selector sent to instance 0x6e709f0

Я не уверен, что здесь происходит; несколько альтернатив тоже не работают, и я думаю, что устранение неполадок направляет меня в неправильном направлении. Что не так с тем, как я называю этот метод? Очевидно, я даже не запускаю метод. ТИА.

Ответы [ 2 ]

2 голосов
/ 31 марта 2012

Трудно следить за тем, что вы пытаетесь сделать, но я бы, вероятно, отправил бы все действия кнопок одному методу, подобному этому

- (void)buttonTapped:(UIButton *)buttonTapped;
{
    NSArray *buttons = [AnswerButtons answerButtons].buttons;

    // some kind of switch statement of logic to perform options depending on which button
    // Can use the following to get the index
    // NSInteger buttonIndex = [buttons indexOfObject:buttonTapped]

    for (UIButton *button in buttons) {
        if (button == buttonTapped) {
            // highlight
        } else {
            // remove highlight
        }
    }
}
1 голос
/ 31 марта 2012

Вы звоните -activateAnswerAtPos: на отправителя, который является кнопкой, к которой вы прикоснулись.Вместо этого вы должны вызывать его для экземпляра класса, который определяет метод -activateAnswerAtPos:.Из вашего кода не ясно, что это такое, но я думаю, что это я:

[self activateAnswerAtPos:0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...