我有多个文本字段的多个pickerView时出现NSRangeException

时间:2016-04-13 18:54:43

标签: objective-c uipickerview nsrangeexception

#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文件代码。当我运行模拟器时,高度的第一个文本字段工作正常,但在权重和日期文本字段中,选择器视图获得了异常。

Simulator screen shot

NSRangeException screen shot

1 个答案:

答案 0 :(得分:0)

例外情况Index 5 beyond bounds [0..0]。所以说你有一个大小为1的数组,但要求它为索引5处的对象,这没有意义,所以它会崩溃。

追溯表示正在从objectAtIndex调用selectedRowInComponent:方法,该方法是从didSelectRow:inComponent调用的。因此,这表明您将无效的组件号传递给selectedRowInComponent

我不知道weightComponentmonth/day/yearComponent的设置位置,但我猜测它们并未分别设置为0和0,1和2。

顺便说一句,我还要补充一点,当你有一个带有标签0ft1ft等的选择器时,你不会留下所有这些表格。不要创建表格并将其编入索引,只需使用titleForRow

回答return [NSString stringWithFormat:@"%dft",row];来电即可