2013-08-28 2 views
0

Это код:Непризнанный вопрос селектор

@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 

Если я нажимаю кнопку Назад на панели инструментов Выбор даты я получаю это исключение:

[CreateAccountViewController gotoPreviousBirthdate:]: unrecognized selector sent to instance 

Если я нажмите кнопку Далее с даты панель выбора я получаю это исключение:

[CreateAccountViewController gotoNextBirthdate:]: unrecognized selector sent to instance 

Если я нажать кнопку Готово на панели инструментов выбора даты I ге т это исключение:

[CreateAccountViewController dismissDateSet:]: unrecognized selector sent to instance 

Это кажется, что я делаю ту же ошибку в 3 раза, но я не могу вполне понять, что это такое. Благодаря

+0

Возможный дубликат [Когда использовать двоеточие с @selector] (http://stackoverflow.com/questions/4953623/when-to-use-a-colon-with-a-selector) –

ответ

2

Вашей установки целевого выбора быть:

@selector(gotoPreviousBirthdate:) 

Но вы объявляете его как:

-(void)gotoPreviousBirthdate; 

Снимите: в селекторе как @selector(gotoPreviousBirthdate), так как вы не принимаете аргумент , или изменить объявление на -(void)gotoPreviousBirthday:(id)sender.

Затем повторите для двух других.

+0

Спасибо. Теперь я не получаю это исключение, но ничего не работает. Еще раз спасибо. – user2611691

0

Вы вызываете методы, как если бы они были методами класса, но они объявлены как методы экземпляра в вашем интерфейсе. Неправильное обращение к селектору.

Создать экземпляр класса первой:

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

Тогда вы можете вызвать методы экземпляра:

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

Или, если вы объявили метод как

+(void)gotoPreviousBirthdate; 

примечание + в подписи - тогда вы можете вызвать метод, как показывает ваш код.

Это довольно фундаментальная концепция в Objective-C, поэтому я бы рекомендовал вам сначала прочитать документацию. Apple Objective-C Primer

Смежные вопросы