2017-03-09 96 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