2017-03-09 91 views
-2

我正在使用一个人脸倍增器应用程序,并试图确定它为什么会崩溃的错误;NSRangeException索引超出界限错误

[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 5]' 

的方法swapTapped我相信沿线某处导致了问题...

//Create collection 
    faceViews = [[NSMutableArray alloc] init]; 

int faceIndex; 

- (IBAction)swapTapped:(id)sender { 
    //Play sound 
    [[AVAudio sharedAudio] playSound: @"explosion"]; 

    //Show flash 
    [self.view bringSubviewToFront: self.flashView]; 
    self.flashView.alpha = 1.0; 
    self.flashView.hidden = FALSE; 
    [UIView animateWithDuration:0.5 animations:^{ 
     self.flashView.alpha = 0.0; 
    } completion:^(BOOL finished) { 
     self.flashView.hidden = TRUE; 
    }]; 

    //Make all faces the same 
    faceIndex++; 

    if (faceIndex >= self.faceViews.count) 
    { 
     return; 
    } 

     FaceView *faceViewIndex = [self.faceViews objectAtIndex: faceIndex]; // I believe it crashes here 

    UIImage *baseImage = faceViewIndex.baseImage; 
    for (FaceView *fv in self.faceViews) 
     [fv setFaceImage: baseImage]; 
} 

这里是另一个方法;

-(void) swapFaces { 
    //Deselect all faces 
    [self deselectFaces]; 

    //Reset tag flag to zero 
    for (FaceView *crtFaceView in self.faceViews) 
     crtFaceView.tag = 0; 

    //Swap each photo 
    for (int i=0; i<[self.faceViews count];i++) { 
     //Get current and next 
     FaceView *crtFaceView = [self.faceViews objectAtIndex: i]; 
     FaceView *nxtFaceView = crtFaceView == [self.faceViews lastObject] ? [self.faceViews objectAtIndex: 0] : [self.faceViews objectAtIndex: i+1]; 

     //Only not swaped yet 
     if (crtFaceView.tag == 0 && nxtFaceView.tag == 0) { 
      //Change flag 
      crtFaceView.tag = 1; 
      nxtFaceView.tag = 1; 

      //Calculate scale 
      float ratioX = nxtFaceView.bounds.size.width/crtFaceView.bounds.size.width; 
      float ratioY = nxtFaceView.bounds.size.height/crtFaceView.bounds.size.height; 

      //Auto saturation matching 
      crtFaceView.saturation = nxtFaceView.meanSaturation/crtFaceView.meanSaturation; 
      crtFaceView.brightness = nxtFaceView.meanBrightness/crtFaceView.meanBrightness; 

      //Auto flip 
      if (crtFaceView.faceType != nxtFaceView.faceType && crtFaceView.faceType != 0 && nxtFaceView.faceType != 0) { 
       crtFaceView.flipped = TRUE; 
       nxtFaceView.flipped = TRUE; 
      } else { 
       crtFaceView.flipped = FALSE; 
       nxtFaceView.flipped = FALSE; 
      } 

      //Animate to position 
      [UIView beginAnimations: @"" context: nil]; 
      [UIView setAnimationDuration: 0.5]; 
      [UIView setAnimationCurve: UIViewAnimationCurveEaseOut]; 

      //Save original frame and transform 
      CGPoint tempCenter = crtFaceView.originalCenter; 
      CGAffineTransform tempTransform = crtFaceView.originalTransform; 

      //Swap object one 
      crtFaceView.center = nxtFaceView.originalCenter; 
      crtFaceView.transform = CGAffineTransformScale(nxtFaceView.originalTransform, ratioX, ratioY); 

      //Swap object two 
      nxtFaceView.center = tempCenter; 
      nxtFaceView.transform = CGAffineTransformScale(tempTransform, 1/ratioX, 1/ratioY); 

      //Commit animation 
      [UIView commitAnimations]; 
     } 
    } 
} 

的万无一失的方法来获得应用崩溃是按swapTapped按钮3次,它喜欢通过周期,但崩溃了,当它认为该指数超出界限...?

编辑 - 它在这条线上崩溃;

FaceView *faceViewIndex = [self.faceViews objectAtIndex: faceIndex]; 
+0

这并没有阻止错误不幸 – Hypergater

+0

哪一行正是导致错误? – rmaddy

+0

我已经添加了另一种方法'swapFaces'我认为Faceview数组导致问题 – Hypergater

回答

-1

//我不知道你究竟增加

faceIndex++; 

    if (faceIndex < self.faceViews.count) 
    { 
    FaceView *faceViewIndex = [self.faceViews objectAtIndex: faceIndex]; 

     UIImage *baseImage = faceViewIndex.baseImage; 
     for (FaceView *fv in self.faceViews) 
      [fv setFaceImage: baseImage]; 

    } 
+0

这样可以在第三次点击时停止崩溃,我的示例照片有4个人,并且通过此方法,我可以循环每个BUT的面部,只要点击过去,如果我尝试继续,应用程序崩溃,所以我需要找出如何限制它只能点击屏幕上的人的次数。 – Hypergater

0

在的情况下,要克服这种大跌,加

if(faceIndex < [self.faceViews count] && [self.faceViews count] > 0) { 
    FaceView *faceViewIndex = [self.faceViews objectAtIndex: faceIndex]; 
    } 
+0

那么新方法应该看起来像这样? '//新方法 faceIndex ++;如果(faceIndex <[self.faceViews count]){ FaceView * faceViewIndex = [self.faceViews objectAtIndex:faceIndex]; } FaceView * faceViewIndex = [self.faceViews objectAtIndex:faceIndex]; UIImage * baseImage = faceViewIndex.baseImage; for(FaceView * fv in self.faceViews) [fv setFaceImage:baseImage]; } //结束新方法 – Hypergater

+0

yes @Hypergater!询问/回复我是否需要其他帮助? –

+0

嗨,嗯,它仍然崩溃... – Hypergater