簡體   English   中英

[__NSArrayI pickerView:numberOfRowsInComponent:]:無法識別的選擇器已發送到實例

[英][__NSArrayI pickerView:numberOfRowsInComponent:]: unrecognized selector sent to instance

此代碼的基本前提是它具有兩個字段,一個文本字段以英尺為單位存儲人的身高,一個文本字段以英寸為單位存儲身高。 因此,當有人單擊“英尺”文本字段或“英寸”文本字段時,會彈出一個選擇器視圖,允許用戶選擇高度。 但是,出現以下錯誤:

[__NSArrayI pickerView:numberOfRowsInComponent:]: unrecognized selector sent to instance

當我運行以下代碼時:

#import "GetUserStatistics.h"

@interface GetUserStatistics ()

@end

@implementation GetUserStatistics

@synthesize feetField, inchesField, pickerViewFeet, pickerViewInches, ftPicker, inPicker;
- (void)viewDidLoad {
    [super viewDidLoad];
    pickerViewFeet = [self createNumberPickerViewWithStartingValue:1 endingValue:8 defaultValue:5];
    NSLog(@"%f", pickerViewFeet.frame.size.height);
    feetField.inputView = pickerViewFeet;
    NSLog(@"%f", feetField.inputView.frame.size.height);

    //feetField.inputAccessoryView = [self createToolbar];
    pickerViewInches = [self createNumberPickerViewWithStartingValue:0 endingValue:11 defaultValue:8];
    NSLog(@"%f",pickerViewInches.frame.size.height);
    inchesField.inputView = pickerViewInches;
    NSLog(@"%f", inchesField.inputView.frame.size.height);

    //NSLog(@"%@", pickerViewFeet.delegate);
    //inchesField.inputAccessoryView = [self createToolbar];
}

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


- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}

-(void) inputAccessoryViewDidFinish{
    feetField.text = [[NSString alloc]initWithFormat:@"%i", [(UIPickerView *)feetField.inputView selectedRowInComponent:0]];
    inchesField.text = [[NSString alloc]initWithFormat:@"%i", [(UIPickerView *)inchesField.inputView selectedRowInComponent:0]];
    actualHeight = ([feetField.text intValue])*12 + [inchesField.text intValue];
    NSLog(@"actual height:%i", actualHeight);
    [feetField endEditing:YES];
    [inchesField endEditing:YES];
}
-(UIPickerView *) createNumberPickerViewWithStartingValue: (int) startVal endingValue: (int) endingVal defaultValue: (int) defaultValue{
    UIPickerView * tempPicker = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 50, 100, 150)];
    ftPicker = [[NumberPickerView alloc]initWithStartingValue:startVal endingVal:endingVal];
    tempPicker.delegate = ftPicker;
    [tempPicker selectRow:defaultValue inComponent:0 animated:NO];
    return tempPicker;
}

-(UIToolbar * ) createToolbar{

    UIToolbar *myToolbar = [[UIToolbar alloc] initWithFrame:
                            CGRectMake(0,0, 320, 44)]; //should code with variables to support view resizing
    UIBarButtonItem *doneButton =
    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                  target:self action:@selector(inputAccessoryViewDidFinish)];


    //using default text field delegate method here, here you could call
    //myTextField.resignFirstResponder to dismiss the views
    [myToolbar setItems:[NSArray arrayWithObject: doneButton] animated:NO];
    return myToolbar;
}
-(void) addPickerViewToTextField: (UITextField **) textField pickerViewToAdd : (UIPickerView **) pickerView{
    NSLog(@"dading view");

    *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 50, 100, 150)];
}

@end

NumberPickerView代碼(實現UIPickerViewDelegate協議):

-(NumberPickerView *) initWithStartingValue: (int) startingVal endingVal: (int) endingVal
{
    startingValue = startingVal;
    endingValue = endingVal;
    return self;
}
// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1;
}

// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    NSLog(@"calling this function");
    return endingValue - startingValue + 1;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return [[NSString alloc]initWithFormat:@"%i", (int)(row) + startingValue];
}

我懷疑問題出在UIPickerView的返回上,特別是在函數返回視圖后NumberPickerView被破壞了,因此pickerViewFeet不再具有委托。 我不確定這是否是問題所在,以及如何解決此問題,有人可以幫忙嗎?

謝謝!

您兩次調用createNumberPickerViewWithStartingValue 在第二個呼叫結果ftPicker被重置的新實例NumberPickerView 這意味着分配給第一個選擇器視圖的第一個實例將被釋放。 這導致崩潰。

您需要重新組織代碼,以便不使用相同的實例變量來保存兩個NumberPickerView實例。

您還需要更新的教程。 在大多數情況下,您不應該調用@synthesize 而且,您對屬性實例變量的所有引用都應改為對實際屬性的引用。

首先使用self.ftPicker而不是ftpicker並:

-(NumberPickerView *) initWithStartingValue: (int) startingVal endingVal:(int) endingVal {
    self = [super init]; 
    startingValue = startingVal;
    endingValue = endingVal;
    return self; 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM