0
#import "ProfileViewController.h"

@implementation ProfileViewController{
    NSArray *currentArray;
    UITextField *currentTextField;
}

@synthesize picker, Feets, Inchs, Weights, Months, Days, Years, HeightValue, WeightValue, DOBValue;
@synthesize scrollView;
int variabla;

// Control the textfield go up when tap the textfield and keyboard coming out
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGPoint scrollPoint = CGPointMake(0, textField.frame.origin.y);
    [scrollView setContentOffset:scrollPoint animated:YES];
    [textField resignFirstResponder];
    [picker setHidden:YES];
    currentTextField = textField;
    NSLog(@"222222");
    if (currentTextField == HeightValue)
    {
        NSLog(@"3333333");
        [HeightValue resignFirstResponder];
        [picker setHidden:NO];
        variabla = 1;
    }
    else if (currentTextField == WeightValue)
    {
        NSLog(@"4444444");
        [WeightValue resignFirstResponder];
        [picker setHidden:NO];
        variabla = 2;
    }
    else if (currentTextField == DOBValue){
        NSLog(@"5555555");
        [DOBValue resignFirstResponder];
        [picker setHidden:NO];
        variabla = 3;
    }
    NSLog(@"variabla %d",variabla);
    [picker reloadAllComponents];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"111111");
 NSString *path = [[NSBundle mainBundle]pathForResource:@"WeightList" ofType:@"plist"];
    Weights = [[NSMutableArray alloc]initWithContentsOfFile:path];

    [picker setHidden:YES];

 Feets = [[NSMutableArray alloc]initWithObjects:@"0ft", @"1ft", @"2ft", @"3ft", @"4ft", @"5ft", @"6ft", @"7ft", @"8ft", @"9ft",nil];
    Inchs = [[NSMutableArray alloc]initWithObjects:@"0in", @"1in", @"2in", @"3in", @"4in", @"5in", @"6in", @"7in", @"8in", @"9in", @"10in", @"11in",nil];
    Months = [[NSMutableArray alloc]initWithObjects:@"1", @"2", @"3",nil];
    Days = [[NSMutableArray alloc]initWithObjects:@"1", @"2", @"3",nil];
    Years = [[NSMutableArray alloc]initWithObjects:@"1", @"2", @"3",nil];


#pragma mark - UIPcikerView DataSource and Delegate method
    // returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    if (variabla == 1){
        return 2;
    }
    else if (variabla == 2){
        return 1;
    }
    else
        return 3;
}

    // returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    if (variabla == 1){
        if (component == feetComponent)
            return [Feets count];
        if (component == inchComponent)
            return [Inchs count];
    }
    if (variabla == 2){
        return [Weights count];
    }
    else{
        if (component == monthComponent)
            return [Months count];
        if (component == dayComponent)
            return [Days count];
        else
            return [Years count];
    }
}


  // set the row text to the textfield
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component __TVOS_PROHIBITED{
    if (variabla == 1){
        if (component == feetComponent)
            return Feets[row];
        if (component == inchComponent)
            return Inchs[row];
    }
    if (variabla == 2){
        return Weights[row];
    }
    else{
        if (component == monthComponent)
            return Months[row];
        if (component == dayComponent)
            return Days[row];
        else
            return Years[row];
    }
}


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component __TVOS_PROHIBITED{
    if (currentTextField == HeightValue){
        NSInteger feetRow = [picker selectedRowInComponent:feetComponent];
        NSInteger inchRow = [picker selectedRowInComponent:inchComponent];
        NSString *feet = Feets[feetRow];
        NSString *inch = Inchs[inchRow];
        NSString *msg = [[NSString alloc]initWithFormat:@"%@ %@", feet, inch];
        HeightValue.text = msg;
    }
    if (currentTextField == WeightValue){
        NSInteger weightRow = [picker selectedRowInComponent:weightComponent];
        NSString *weight = Weights[weightRow];
        NSString *msg2 = [[NSString alloc]initWithFormat:@"%@",weight];
        WeightValue.text = msg2;
    }
    if (currentTextField == DOBValue){
        NSInteger monthRow = [picker selectedRowInComponent:monthComponent];
        NSInteger dayRow = [picker selectedRowInComponent:dayComponent];
        NSInteger yearRow = [picker selectedRowInComponent:yearComponent];
        NSString *month = Months[monthRow];
        NSString *day = Days[dayRow];
        NSString *year = Years[yearRow];
        NSString *msg3 = [[NSString alloc]initWithFormat:@"%@ / %@ / %@", month, day, year];
        WeightValue.text = msg3;
    }

}

@end

上記は.mファイルコードです。シミュレーターを実行すると、最初の高さのテキスト フィールドは正常に機能していますが、重量と日付のテキスト フィールドでは、ピッカー ビューで例外が発生しました。

シミュレーターのスクリーンショット

NSRangeException のスクリーン ショット

4

1 に答える 1

0

まあ例外は言うIndex 5 beyond bounds [0..0]。これは、サイズ 1 の配列があることを示していますが、インデックス 5 のオブジェクトを要求しているため、意味がなく、クラッシュします。

トレースバックは、objectAtIndexメソッドが から呼び出されselectedRowInComponent:、それが から呼び出されていることを示していますdidSelectRow:inComponent。これは、無効なコンポーネント番号を に渡していることを示唆していますselectedRowInComponent

weightComponentとがどこに設定されているかはわかりませんがmonth/day/yearComponent、それぞれ 0 と 0、1、および 2 に設定されていないと推測しています。

余談ですが、ラベル付きのピッカーなどがある場合は、これらすべてのテーブルを保持しないことも追加し0ftます1ft。テーブルを作成してインデックスを作成する代わりに、titleForRow呼び出しに応答するだけですreturn [NSString stringWithFormat:@"%dft",row];

于 2016-04-13T21:01:58.153 に答える