1

I am making an app in Xcode and my goal is when a button is pressed a method will be run. The Problem is when the button is pressed the first time I want to change a variable/NSString so the next time it is pressed it does something else. By the way I have 375 different methods it could go to, depending on the variable name.

If you could help me I would really appreciate it.

I have not added all of the methods yet

My code is

//
//  Game.m
//  Trivia in a Jar
//
//  Created by Jayden Kelly on 12/11/2013.
//  Copyright (c) 2013 Jaydz Media. All rights reserved.
//
#import "Game.h"
#import "Categories.h"
@interface Game ()
@end
@implementation Game
-(IBAction)AnswerLabel1:(id)sender{
    Selected = [NSString stringWithFormat:@"%@", Answer1.currentTitle];
    if ([Selected isEqualToString:CorrectAnswer]) {
        NSString *name = @"Question8Science"; SEL selector = NSSelectorFromString(name); [self performSelector:selector];
    }
    else {
        [self Question5Science];
    }
}
-(IBAction)AnswerLabel2:(id)sender{
    Selected = [NSString stringWithFormat:@"%@", Answer2.currentTitle];
    if ([Selected isEqualToString:CorrectAnswer]) {
        [self Question5Science];
    }else {
        [self Question5Science];    }
}
-(IBAction)AnswerLabel3:(id)sender{
    Selected = [NSString stringWithFormat:@"%@", Answer3.currentTitle];
    if ([Selected isEqualToString:CorrectAnswer]) {
        [self Question5Science];
    }else {
        [self Question5Science];
    }
}
-(void)Prepare{
    QuestionLabel.text = [NSString stringWithFormat:@"%@", Question];
    [Answer1 setTitle:[NSString stringWithFormat:@"%@",OAnswer1] forState:UIControlStateNormal];
    [Answer2 setTitle:[NSString stringWithFormat:@"%@",OAnswer2] forState:UIControlStateNormal];
    [Answer3 setTitle:[NSString stringWithFormat:@"%@",OAnswer3] forState:UIControlStateNormal];
}
-(void)Question{

}
-(void)Question1Science{
    Question = [NSString stringWithFormat:@"What is the term used to explain the process of plant turning carbon dioxide to Oxygen?"];
    OAnswer1 = [NSString stringWithFormat:@"Transpiration"];
    OAnswer2 = [NSString stringWithFormat:@"Precipitation"];
    OAnswer3 = [NSString stringWithFormat:@"Plants don’t turn carbon dioxide into Oxygen."];
    CorrectAnswer = [NSString stringWithFormat:@"%@", OAnswer1];
    [self Prepare];
}
-(void)Question2Science{
    Question = [NSString stringWithFormat:@"The Metal Bronze is made by mixing Copper and What?"];
    OAnswer1 = [NSString stringWithFormat:@"Copper and Aluminium"];
    OAnswer2 = [NSString stringWithFormat:@"Copper and Iron"];
    OAnswer3 = [NSString stringWithFormat:@"Copper and Tin"];
    CorrectAnswer = [NSString stringWithFormat:@"Copper and Tin"];
        [self Prepare];
}
-(void)Question3Science{
    Question = [NSString stringWithFormat:@"What is the symbol for Water?"];
    OAnswer1 = [NSString stringWithFormat:@"H2o"];
    OAnswer2 = [NSString stringWithFormat:@"Co2"];
    OAnswer3 = [NSString stringWithFormat:@"Wa"];
    CorrectAnswer = [NSString stringWithFormat:@"H20"];
    [self Prepare];
}
-(void)Question4Science{
    Question = [NSString stringWithFormat:@"How many colours are in a rainbow?"];
    OAnswer1 = [NSString stringWithFormat:@"6"];
    OAnswer2 = [NSString stringWithFormat:@"7"];
    OAnswer3 = [NSString stringWithFormat:@"8"];
    CorrectAnswer = [NSString stringWithFormat:@"7"];
    [self Prepare];
}
-(void)Question5Science{
    Question = [NSString stringWithFormat:@"What is the Largest Internal Organ in the Human Body?"];
    OAnswer1 = [NSString stringWithFormat:@"Liver"];
    OAnswer2 = [NSString stringWithFormat:@"Heart"];
    OAnswer3 = [NSString stringWithFormat:@"Lungs"];
    CorrectAnswer = [NSString stringWithFormat:@"Liver"];
    [self Prepare];
}
-(void)Question6Science{
    Question = [NSString stringWithFormat:@"Popcorn Pops Because:"];
    OAnswer1 = [NSString stringWithFormat:@"The water on the outside turns into steam and blows it up like a balloon"];
    OAnswer2 = [NSString stringWithFormat:@"The there is a hole on the inside and when it gets hot it blown up and explodes"];
    OAnswer3 = [NSString stringWithFormat:@"The Microwave sprays a magic ingredient and makes the popcorn grow magically"];
    CorrectAnswer = [NSString stringWithFormat:@"The water on the outside turns into steam and blows it up like a balloon"];
    [self Prepare];
}
-(void)Question7Science{
    Question = [NSString stringWithFormat:@"How many Bones are in The Human Skeleton?"];
    OAnswer1 = [NSString stringWithFormat:@"206"];
    OAnswer2 = [NSString stringWithFormat:@"207"];
    OAnswer3 = [NSString stringWithFormat:@"308"];
    CorrectAnswer = [NSString stringWithFormat:@"206"];
    [self Prepare];
}
-(void)Question8Science{
    Question = [NSString stringWithFormat:@"The Cranium is also know as What Part of the Body?"];
    OAnswer1 = [NSString stringWithFormat:@"Head"];
    OAnswer2 = [NSString stringWithFormat:@"Leg"];
    OAnswer3 = [NSString stringWithFormat:@"Finger"];
    CorrectAnswer = [NSString stringWithFormat:@"Head"];
}
-(void)Question9Science{
    Question = [NSString stringWithFormat:@"What part of the human body is the pupil located on?"];
    OAnswer1 = [NSString stringWithFormat:@"Chest"];
    OAnswer2 = [NSString stringWithFormat:@"Eye"];
    OAnswer1 = [NSString stringWithFormat:@"Finger"];
    CorrectAnswer = [NSString stringWithFormat:@"Eye"];
}
-(void)Question10Science{
    Question = [NSString stringWithFormat:@"How many calories does water contain?"];
    OAnswer1 = [NSString stringWithFormat:@"897 calories"];
    OAnswer2 = [NSString stringWithFormat:@"0 calories"];
    OAnswer3 = [NSString stringWithFormat:@"42 calories"];
    CorrectAnswer = [NSString stringWithFormat:@"0 calories"];
}
-(void)Question11Science{
    Question = [NSString stringWithFormat:@"What is the melting point for Iron?"];
    OAnswer1 = [NSString stringWithFormat:@"1536°C"];
    OAnswer2 = [NSString stringWithFormat:@"1537°C"];
    OAnswer3 = [NSString stringWithFormat:@"1538°C"];
    CorrectAnswer = [NSString stringWithFormat:@"1536°C"];
}
-(void)Question12Science{
    Question = [NSString stringWithFormat:@"What is the melting point for Metal?"];
    OAnswer1 = [NSString stringWithFormat:@"660°C"];
    OAnswer2 = [NSString stringWithFormat:@"720°C"];
    OAnswer3 = [NSString stringWithFormat:@"870°C"];
    CorrectAnswer = [NSString stringWithFormat:@"660°C"];
}
-(void)Question13Science{
    Question = [NSString stringWithFormat:@"Approximately how many bird species do we have in the world?"];
    OAnswer1 = [NSString stringWithFormat:@"50"];
    OAnswer2 = [NSString stringWithFormat:@"10,000"];
    OAnswer3 = [NSString stringWithFormat:@"15,000"];
    CorrectAnswer = [NSString stringWithFormat:@"10,000"];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
- (void)viewDidLoad
{
    Next = [NSString stringWithFormat:@"7Science"];
    CategoryLabel.text = [NSString stringWithFormat:@"%@", SelectedCategory];
    [self Question13Science];
    // Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
  • 2
    Please post what code you have. If you have 375 possible methods, this is probably a sign of bad design. Instead try to use more parameters or conditionals in your methods to combine similar methods into one. no functionality should be coded in two different places. – Patrick Goley Nov 13 '13 at 20:36
  • I have added the code for you – user2989426 Nov 13 '13 at 20:45
  • http://stackoverflow.com/questions/4446883/objective-c-calling-method-dynamically-with-a-string – user523234 Nov 13 '13 at 21:48
  • I fear for the user that has to tap the button 300+ times to get the functionality they want from the button. – DBD Mar 06 '14 at 12:45

2 Answers2

1

If I'm understanding you correctly, you're just looking to conditionalize the events that occur upon button press. If so, you could try something like this:

- (IBAction)linkMeToYourButton:(UIButton *)sender
{
    if (someCondition) {
        [self doSomething];
    }else{
        [self doSomethingElse];
    }
}
Mick MacCallum
  • 129,200
  • 40
  • 280
  • 281
  • But I have 375 different methods that it could go to. Is there a way to do it like [self (vairableName)]? – user2989426 Nov 13 '13 at 20:31
  • 1
    @user2989426 Then you should rethink your design pattern. Instead of 375 different functions, you should make a single function (or a few) that take parameters to determine their behaviors. – Mick MacCallum Nov 13 '13 at 20:32
  • @user2989426 I'm standing by what I just said, and I'm not recommending this, but for the sake of completeness, it is possible to do what you're proposing. Something like this: `NSString *name = @"someName"; SEL selector = NSSelectorFromString(name); [self performSelector:selector];` – Mick MacCallum Nov 13 '13 at 20:35
  • I did what you said but i gives me a warning saying PerformSelctor may cause a leak because its selector is unknown – user2989426 Nov 13 '13 at 20:39
  • @user2989426 No, you did what I said not to do. – Mick MacCallum Nov 13 '13 at 20:55
0

First, declare a variable to keep track of whether the button has been clicked already.

@implementation MyViewController {
    BOOL _buttonAlreadyClicked; // the default value is NO
}

In the tap handler, check that value, and call one of the two methods.

- (IBAction)buttonClickHandler:(UIButton *)sender
{
    if(!_buttonAlreadyClicked) {
        [self doFirstAction];
        _buttonAlreadyClicked = YES;
    }
    else {
        [self doSecondAction];
    }
}

if you have many possible actions, you could define some selectors:

SEL action1 = @selector(action1);
SEL action2 = @selector(action2);

and then in your click handler, call the appropriate selector depending on what you need:

 if(something) {
      [self performSelector:action1];
 } 
 else if(anotherCondition) {
      [self performSelector:action2];
 }
 // etc.

Your selector names have to match the actual methods you've defined,

TotoroTotoro
  • 17,524
  • 4
  • 45
  • 76