【问题标题】:iOS - Wierd out of bound exceptioniOS - 奇怪的越界异常
【发布时间】:2013-12-12 10:05:19
【问题描述】:

我有一个带有一些字符串的pickerView (0,1,2,3,4,5,6,7) 和另一个组件(0,15,30,45)

一切正常,除了当我从组件 1 中选择 3 以上的东西时。它给了我一个超出范围的异常。

在viewDidLoad我声明并填写。

hoursArray = @[@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7"];

我根本不碰它,只为nslogs。 在选择器 didSelectRow 中,我可以 NSlog([hoursarray objectAtindex:7) 它写 7。

但如果我在选择器中选择 3 以上,它会给我:

由于未捕获的异常“NSRangeException”而终止应用程序,原因: '* -[__NSArrayI objectAtIndex:]: 索引 4 超出范围 [0 .. 3]

下面的代码是一个 NSLOG 打印数组索引 4,它的工作。 但在选择器索引 4 超出范围,它是同一个数组

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

NSLog(@"hours array index 4:%@",[hoursArray objectAtIndex:7]);


NSString *selectedHours = @"0";
NSString *selectedQuarters = @"0";

//get picker values
if(component==0) {
    selectedHours = [hoursArray objectAtIndex:row];
    selectedQuarters = [quarterArray objectAtIndex:row];
}else {
    selectedHours = [hoursArray objectAtIndex:row];
    selectedQuarters = [quarterArray objectAtIndex:row];
}
//create formatted date
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@" dd/MM"];
NSString *displayDate = [formatter stringFromDate:[datePicker date]];

NSString *lblString = [[NSString alloc]initWithFormat:@"Tryk for at tilføje %@ time(r) & %@ minutter til d. %@ ",selectedHours,selectedQuarters,displayDate];

[btnRegistrer setTitle:lblString forState:UIControlStateNormal];

}

【问题讨论】:

  • 你也应该显示一些代码!
  • 在我看来,您在选择器中使用了 (0, 15, 30, 45)。
  • 我真的不知道该显示什么,它真的很简单。我创建了一个数组,填充它,尝试获取选择器中选择的值,它给出了一个奇怪的异常。
  • 也许你倒置了 pickerView 的两个组件......这个例外涉及一个由 4 个元素组成的数组,这可能是你命名为“另一个组件”的那个,它只有 4 个元素 :-)
  • 显示 pickerView 委托方法。

标签: ios objective-c indexoutofboundsexception


【解决方案1】:

你在 if 的两个语句中都有相同的代码!! 应该是:

if(component==0) {
    selectedHours = [hoursArray objectAtIndex:row];
}else {
    selectedQuarters = [quarterArray objectAtIndex:row];
}

编辑:我在看到您使用完整委托方法的最后编辑之前回答了,此外,您必须更改一些逻辑,因为如果用户同时更改时间和季度,您将有两个后续的委托调用,并且您必须调整selectedHours 和selectedQuarters。 您最好将这两个变量移动到 @property 中以完成此操作

【讨论】:

  • 是的,你打败了我!希望这只是长时间查看相同代码的情况
  • 这仍然不能回答为什么我的 hoursArray 在索引 3 以上出站
  • 超出范围的数组不是 hoursArray!是四分之一阵!!!跟我来:用户更改第一列(小时)选择7,如果通过第一个选项(组件== 0),然后你在hoursArray(正确)和QuarterArray上执行objectAtIndex:7(错误,抛出异常)
【解决方案2】:

我正在尝试编写清晰的代码..它可能会对您有所帮助..

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:  (NSInteger)component{

  NSLog(@"hours array index 4:%@",[hoursArray objectAtIndex:7]);

  //get picker values
 if(component==0) {
    self.selectedHours = [hoursArray objectAtIndex:row];
   }else if(component==1){
    self.selectedQuarters = [quarterArray objectAtIndex:row];
   }

  [self showButtonTitle];
}
-(void)showButtonTitle
{
   //create formatted date
  NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
  [formatter setDateFormat:@" dd/MM"];
  NSString *displayDate = [formatter stringFromDate:[datePicker date]];

  NSString *lblString = [[NSString alloc]initWithFormat:@"Tryk for at tilføje %@ time(r) &     %@ minutter til d. %@     ",self.selectedHours,self.selectedQuarters,displayDate];

   [btnRegistrer setTitle:lblString forState:UIControlStateNormal];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2018-06-07
    • 2013-11-28
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多