2013-08-28 47 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 

如果我從日期選擇器工具欄按下完成按鈕我ge牛逼此異常:

[CreateAccountViewController dismissDateSet:]: unrecognized selector sent to instance 

它看來我犯同樣的錯誤3次,但我不能完全弄清楚那是什麼。 感謝

+0

可能的重複[何時使用冒號與@選擇器](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

相關問題