由于indexvalue超出范围,无法插入NSMutableArray

时间:2014-02-20 20:56:33

标签: ios objective-c nsmutablearray

我在这个名为array的视图上有一个MutableArray,有问题的对象是detailItem,它的属性为rank(int)。在这个视图中,有一个显示排名的文本字段,我希望能够通过更改排名来移动detailItem上下MutableArray。

所以,例如,让我们说detailItem的排名为3,索引值为2.如果我在文本字段中将其更改为3,我希望数组调整并将其向下移动一个地点。但是,当我输入rankField(文本字段)的值时,它会崩溃应用程序,因为它会在我完成编辑之前自动更新该值。因此,如果我单击文本字段并写入23(删除2时计划)或只按删除(现在值为nil),应用程序将因未捕获的异常而崩溃。

以下是代码:

- (IBAction)rankFIeldTextChanged:(id)sender {
  QueueMember *member = self.detailItem;
  [self.array removeObjectAtIndex:self.detailItem.rank];

  if (0<= [self.rankField.text intValue]<= self.array.count) {
    [self.array insertObject:member atIndex:[self.rankField.text intValue]-1];
  }
}

在数组大小和0之间设置文本值的if条件似乎没有效果。

btw这是在detailsViewController中,它通过push segue连接到主视图控制器。是否更有意义(或更好的编码)只是在细节中设置新的排名值并实际在mainviewcontroller.m中进行数组更改?

2 个答案:

答案 0 :(得分:1)

问题是你试图一次做两个布尔语句(这不起作用)。将if语句更改为:

if (0< [self.rankField.text intValue] && [self.rankField.text intValue] < self.array.count) {
    //Insert your object here
}
else
{
    //Add object here
}

您当前的设置检查是否0<= [self.rankField.text intValue],对于所有大于或等于0的值,它将返回true。然后它检查结果(YES:1,NO:0),如果它小于或等于你的数组计数。如果您的数组中包含任何内容,那么它将始终返回true。所以基本上你的支票总是会回归真实。

因为它总是返回true,所以我可以检查数组对象号1000,你的if语句说得去,然后我检查并且数组说“没办法!”并崩溃你的应用程序。

编辑:更新了我的代码段,以考虑您的阵列插入行。

答案 1 :(得分:0)

我只是这样做

- (IBAction)rankFIeldTextChanged:(id)sender {
  QueueMember *member = self.detailItem;
  [self.array removeObjectAtIndex:self.detailItem.rank];

  if ((0<= [self.rankField.text intValue])&&([self.rankField.text intValue]<= self.array.count)) {

     if (self.array.count >([self.rankField.text intValue]-1)){
        [self.array insertObject:member atIndex:[self.rankField.text intValue]-1];
    }
  }
}

你可能试图插入一个大于数组计数的索引。