user2611691
user2611691

Reputation: 67

Unrecognized selector issue

This is the code:

@interface CreateAccountViewController : UIViewController<UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate>
{
    UIToolbar *keyboardToolbar;
    NSDate *birthdate;
    UIActionSheet *dateSheet;
}

@property(strong, nonatomic) IBOutlet UITextField *txtFirstName;
@property(strong, nonatomic) IBOutlet UITextField *txtLastName;
@property(strong, nonatomic) IBOutlet UITextField *txtGender;
@property(strong, nonatomic) IBOutlet UITextField *txtBirthdate;
@property(strong, nonatomic) IBOutlet UITextField *txtEmail;

-(void)resignKeyboard:(id)sender;
-(void)gotoPreviousField:(id)sender;
-(void)gotoNextField:(id)sender;

-(void)setBirth;
-(void)dismissDateSet;
-(void)gotoPreviousBirthdate;
-(void)gotoNextBirthdate;

@end

@implementation CreateAccountViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [[[keyboardToolbar items] objectAtIndex:0] setEnabled:YES];
    [[[keyboardToolbar items] objectAtIndex:1] setEnabled:YES];
    if([textField isEqual:self.txtFirstName])
    {
        [[[keyboardToolbar items] objectAtIndex:0] setEnabled:NO];
    }
    else if([textField isEqual:self.txtEmail])
    {
        [[[keyboardToolbar items] objectAtIndex:0] setEnabled:NO];
    }
}

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if([textField isEqual:self.txtBirthdate])
    {
        [self setBirth];
        return NO;
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view

    if(keyboardToolbar==nil)
    {
        keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];

        UIBarButtonItem *btnPrevious = [[UIBarButtonItem alloc] initWithTitle:@"Previous" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoPreviousField:)];

        UIBarButtonItem *btnNext = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoNextField:)];

        UIBarButtonItem *btnExtraSpace= [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

        UIBarButtonItem *btnDone=[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(resignKeyboard:)];

        [keyboardToolbar setItems:[[NSArray alloc] initWithObjects:btnPrevious, btnNext, btnExtraSpace, btnDone, nil]];
    }
}

-(void) resignKeyboard:(id)sender
{
    if([self.txtFirstName isFirstResponder])
    {
        [self.txtFirstName resignFirstResponder];
    }
    else if([self.txtLastName isFirstResponder])
    {
        [self.txtLastName resignFirstResponder];
    }
    else if([self.txtGender isFirstResponder])
    {
        [self.txtGender resignFirstResponder];
    }
    else if([self.txtBirthdate isFirstResponder])
    {
        [self.txtBirthdate resignFirstResponder];
    }
    else if([self.txtEmail isFirstResponder])
    {
        [self.txtEmail resignFirstResponder];
    }
}

-(void) gotoPreviousField:(id)sender
{
    if([self.txtFirstName isFirstResponder])
    {
        [self.txtEmail becomeFirstResponder];
    }
    else if([self.txtLastName isFirstResponder])
    {
        [self.txtFirstName becomeFirstResponder];
    }
    else if([self.txtGender isFirstResponder])
    {
        [self.txtLastName becomeFirstResponder];
    }
    else if([self.txtEmail isFirstResponder])
    {
        [self.txtBirthdate becomeFirstResponder];
    }
}

-(void)gotoNextField:(id)sender
{
    if([self.txtFirstName isFirstResponder])
    {
        [self.txtLastName becomeFirstResponder];
    }
    else if([self.txtLastName isFirstResponder])
    {
        [self.txtGender becomeFirstResponder];
    }
    else if([self.txtGender isFirstResponder])
    {
        [self.txtBirthdate becomeFirstResponder];
    }
    else if([self.txtEmail isFirstResponder])
    {
       [self.txtFirstName becomeFirstResponder];
    }

}

-(void)setBirth
{
    dateSheet=[[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
    [dateSheet setActionSheetStyle:UIActionSheetStyleDefault];

    CGRect pickerFrame=CGRectMake(0, 44, 0, 0);
    UIDatePicker *birthDayPicker=[[UIDatePicker alloc] initWithFrame:pickerFrame];
    [birthDayPicker setDatePickerMode:UIDatePickerModeDate];

    [dateSheet addSubview:birthDayPicker];

    UIToolbar *birthDayToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, dateSheet.bounds.size.width, 44)];
    [birthDayToolbar setBarStyle:UIBarStyleBlackTranslucent];
    [birthDayToolbar sizeToFit];

    UIBarButtonItem *btnPrevious = [[UIBarButtonItem alloc] initWithTitle:@"Previous" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoPreviousBirthdate:)];

    UIBarButtonItem *btnNext = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoNextBirthdate:)];

    UIBarButtonItem *btnExtraSpace= [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

    UIBarButtonItem *btnDone=[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(dismissDateSet:)];

    [birthDayToolbar setItems:[[NSArray alloc] initWithObjects:btnPrevious, btnNext, btnExtraSpace, btnDone, nil]];
    [dateSheet addSubview:birthDayToolbar];
    [dateSheet showInView:self.view];
    [dateSheet setBounds:CGRectMake(0, 0, 320, 485)];
}

-(void)dismissDateSet
{
    NSArray *listOfViews = [dateSheet subviews];
    for(UIView *subView in listOfViews)
    {
        if([subView isKindOfClass:[UIDatePicker class]])
        {
            NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"MM/dd/yyyy"];
            self.txtBirthdate.text=[dateFormatter stringFromDate:[(UIDatePicker*)subView date]];
        }
    }
}

-(void)gotoPreviousBirthdate
{
    [self dismissDateSet];
    [self.txtGender becomeFirstResponder];
}

-(void)gotoNextBirthdate
{
    [self dismissDateSet];
    [self.txtEmail becomeFirstResponder];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 5;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"CreateCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    UITextField *textField = [[UITextField alloc] init];
    textField.enablesReturnKeyAutomatically = YES;
    textField.autocorrectionType = UITextAutocorrectionTypeNo;
    textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
    textField.clearButtonMode=UITextFieldViewModeWhileEditing;
    textField.delegate=self;
    CGRect aRect=CGRectMake(10, 10.f, CGRectGetWidth(cell.bounds)-40.f, 30.f );
    textField.frame = aRect;

    if(indexPath.row==0)
    {
        textField.placeholder = @"First name";
        self.txtFirstName=textField;
    }
    else if(indexPath.row==1)
    {
        textField.placeholder = @"Last name";
        self.txtLastName=textField;
    }
    else if(indexPath.row==2)
    {
        textField.placeholder = @"Gender";
        self.txtGender=textField;
    }
    else if(indexPath.row==3)
    {
        textField.placeholder = @"Date of birth";
        self.txtBirthdate=textField;
    }
    else
    {
        textField.placeholder = @"Email";
        self.txtEmail=textField;
    }

    [cell.contentView addSubview:textField];
    cell.selectionStyle=UITableViewCellSelectionStyleNone;

    textField.inputAccessoryView=keyboardToolbar;

    return cell;

}

@end

If i press the Previous button from the date picker toolbar i get this exception:

[CreateAccountViewController gotoPreviousBirthdate:]: unrecognized selector sent to instance

If i press the Next button from the date picker toolbar i get this exception:

[CreateAccountViewController gotoNextBirthdate:]: unrecognized selector sent to instance

If i press the Done button from the date picker toolbar i get this exception:

[CreateAccountViewController dismissDateSet:]: unrecognized selector sent to instance

It seems that i am making the same mistake 3 times but i can't quite figure out what is that. Thanks

Upvotes: 0

Views: 464

Answers (2)

Dan Fairaizl
Dan Fairaizl

Reputation: 2170

You are calling the methods as if they are class methods, but they are declared as instance methods in your interface. Also the invocation of the selector is incorrect.

Create an instance of the class first:

CreateAccountViewController *vc = [[CreateAccountViewController alloc] init]; //Something like this

Then you can call the instance methods:

[vc gotoPreviousBirthday]; //Note no trailing colon!

Or, if you declared the method as

+(void)gotoPreviousBirthdate;

note the + in the signature - then you could call the method as your code shows.

This is a pretty fundamental concept in Objective-C so I would recommend you read the documentation first. Apple Objective-C Primer

Upvotes: 0

i_am_jorf
i_am_jorf

Reputation: 54600

Your setting the target selector to be:

@selector(gotoPreviousBirthdate:)

But you declare it as:

-(void)gotoPreviousBirthdate;

Remove the : in the selector as @selector(gotoPreviousBirthdate) since you're not taking an argument, or change the declaration to be -(void)gotoPreviousBirthday:(id)sender.

Then repeat for the other two.

Upvotes: 2

Related Questions