2012-03-30 5 views
0

Ich habe den folgenden Code, der eine Berührung auf eine Schaltfläche nimmt und einen Rand um diese Schaltfläche zeichnet, dann stellt sicher, dass alle anderen Schaltflächen keinen Rahmen haben (insgesamt 8 Schaltflächen). Dies ist eine Methode in einer Singleton-Klasse namens AnswerButtons. Dieser Code funktioniert gut.Konvertieren von One-Off-Code zu Methode

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

} 

Nun, ich brauche für alle 8 Tasten diesen Code zu verwenden, also sollte ich eine Methode mit einem Argument schreiben, die Tastennummer (pos) zu ändern. In der Singletonklasse .m I, die praktisch die gleiche Code ist gesetzt:

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

Also änderte ich den ersten Code Chunk es ein Aufruf der neuen Methode zu machen:

- (IBAction)button1WasTouched:(id)sender { 

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

Leider, ich m etwas falsch zu machen, wie ich die folgende Ausnahme bekomme:

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 

Ich bin mir nicht sicher, was hier vor sich geht; Mehrere Alternativen funktionieren auch nicht und ich denke, dass meine Fehlersuche mich in die falsche Richtung schickt. Was ist falsch an der Art, wie ich diese Methode nenne? Natürlich kann ich die Methode nicht einmal ausführen. TIA.

Antwort

1

Sie rufen -activateAnswerAtPos: auf Absender, das ist die Schaltfläche, die berührt wurde. Sie sollten es stattdessen für die Instanz der Klasse aufrufen, die die Methode -activateAnswerAtPos: definiert. Es ist nicht klar, aus dem Code, was das ist, aber meine Vermutung ist selbst:

[self activateAnswerAtPos:0]; 
+0

Verdammt! So einfach. Danke für diese schnelle Antwort, ich bin wieder da und renne wieder. Ich schätze es. –

2

Es ist schwer zu folgen, was Sie zu tun versuchen, aber ich würde wahrscheinlich alle Tastenaktionen auf ein Verfahren wie diese

- (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 
     } 
    } 
} 
senden
+0

Danke Paul. Mein Problem wurde mit der Zeit gelöst, in der du geschrieben hast, aber dein Code zeigt mir einige wesentlich schlankere Wege, etwas zu tun, als das, was ich gemacht habe, also ist es ein Bonus. –

Verwandte Themen