2013-08-29 38 views
1

我想設置一個文本字段,填充用戶輸入的pickerView。我得到這個錯誤每次我啓動應用程序時:NSInvalidArgumentException - 發送到實例的無法識別的選擇器? UITextView/UIPickerView

NSInvalidArgumentException', reason: '-[UITextField isEqualToString:]: unrecognized selector sent to instance. 

@synthesize pickerView; 
@synthesize textArray; 
@synthesize textField; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.textArray = [[NSMutableArray alloc] init]; 

    PFUser *currentUser = [PFUser currentUser]; 
    if (currentUser) { 
    NSLog(@"Current user: %@" , currentUser.username); 
} 
else { 
    [self performSegueWithIdentifier:@"showLogin" sender:self]; 
} 
    self.textField.delegate = self; 

    self.pickerView.dataSource = self; 
    self.pickerView.delegate = self; 

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 

[nc addObserver:self selector:@selector(keyboardWillShow:) name: 
UIKeyboardWillShowNotification object:nil]; 

[nc addObserver:self selector:@selector(keyboardWillHide:) name: 
UIKeyboardWillHideNotification object:nil]; 

self.tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                  action:@selector(didTapAnywhere:)]; 
} 

-(void)didTapAnywhere: (UITapGestureRecognizer *) note { 
    [self.textField resignFirstResponder]; 
} 
-(void) keyboardWillShow:(NSNotification *) note { 
    [self.view addGestureRecognizer:self.tapRecognizer]; 
} 

-(void) keyboardWillHide:(NSNotification *) note 
{ 
    [self.view removeGestureRecognizer:self.tapRecognizer]; 
} 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
    return 1; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component 
{ 
    if ([self.textArray count] == 0) 
     return 1; 
    return [self.textArray count]; 
} 

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent: (NSInteger)component { 
    return [self.textArray objectAtIndex:row]; 
} 

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row forComponent: (NSInteger)component{ 
    NSLog(@"You selected this: %@", [self.textArray objectAtIndex:row]); 
} 

-(void)textFieldDidEndEditing:(UITextField *)textField{ 

    [self.textArray addObject:self.textField.text]; 

    [self.textField resignFirstResponder]; 

} 

- (IBAction)logout:(id)sender { 
    [PFUser logOut]; 
    [self performSegueWithIdentifier:@"showLogin" sender:self]; 
} 
@end 

我是新來的一切,這樣下去容易對我,如果這是基本的東西,它可能是。乾杯!

+0

你能夠發佈異常的整個堆棧跟蹤嗎?單單這一行對你發佈的代碼沒有幫助(如在,你是否在任何地方調用'isEqualToString:'?) – WDUK

+0

im不知道這是否有幫助的信息。從字面上看,我只是在這個編程的事情上過了一個堅實的一週,對調試等知之甚少。 –

+0

這恐怕沒有幫助,但您的問題已在下面回答。 – WDUK

回答

2

您必須

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    return [self.textArray objectAtIndex:row]; 
} 

收到此錯誤如你,而不是返回的文本(標題),一個文本框。

viewDidLoad,改變下面一行:

[self.textArray addObject:self.textField]; 

[self.textArray addObject:self.textField.text]; 

確保有一些文字,所以標題不返回空。那麼你究竟想要把數組放進去?它是文本框還是文本框?

編輯

首先我看到的是缺失文本框代表。在viewDidLoad中設置self.textField.delegate = self;,以便調用textFieldDidEndEditing。在它中,重新加載pickerview,以便它可以正確填充當前文本。

-(void)textFieldDidEndEditing:(UITextField *)textField{ 

    [self.textArray addObject:self.textField.text]; 

    [self.pickerView reloadAllComponents]; 

} 

對於選擇器標題,當在數組中沒有數據,你是返回1.如您在留言說你應該返回的東西。

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent: (NSInteger)component { 

if(self.textArray.count == 0) 
return @"There is nothing"; 
else 
    return [self.textArray objectAtIndex:row]; 
} 

確定要關閉鍵盤,當用戶按下「回車鍵」時應該調用[self.textfield resignFirstResponder]。用你的文本框連接一些方法,例如「hidekeyboard」。

-(IBAction) hidekeyboard:(id) sender 

{ 
[sender resignFirstResponder]; 
} 

希望它可以幫助你..!

enter image description here

+0

我試圖把用戶輸入到文本框中的任何東西放入pickerView中,當它們完成時。但是我無法獲取數據來填充,我也無法獲取它來移除鍵盤。我已經更新我的原始代碼再次顯示當前狀態 –

+0

但現在我得到一個空的數組錯誤。所以你說的是完全正確的。當數組中沒有對象時,我想讓選擇器向用戶顯示一條消息。 –

+0

@JaredGross檢查我的編輯 – NightFury

1

您要添加的文本字段textArray,所以當您嘗試使用textArray來提供titleForRow標題:forComponent:你得到這個錯誤。 textArray應該包含文本,而不是文本字段。

如果你想使用文本字段來填充選擇器,那麼你就應該實現的文本字段的委託方法textFieldDidEndEditing:(或其它),以及文本字段的文本添加到textArray該方法..

+0

瞭解更多關於iOS基本調試的知識,謝謝你們!我檢查了關於調試的網站,並遵循了關於實現textFieldDidEndEditing委託的建議。我現在的問題是:如何將文本字段的「文本」添加到textArray而不是textField? –

+0

@JaredGross,在textFieldDidEndEditing裏面,你可以做[self.textArray addObject:textField.text]; – rdelmar

+0

我將我的textFieldDidEndEditing方法添加到我爲此問題發佈的原始代碼中。我仍然沒有得到任何數據顯示在選取器中,也沒有讓用戶點擊完成後鍵盤消失。再次..我敢肯定它的簡單,但我很欣賞指針! –

相關問題