Сообщение об ошибке: «индекс 1 выходит за рамки»

#objective-c #ios #indexing #nsarray

#objective-c #iOS #индексирование #nsarray

Вопрос:

Я всего лишь новичок и, похоже, не могу найти ошибку. Это фрагмент кода для масштабирования, поворота и перемещения UIImageView. Я могу переместить UIImageView, но когда я пытаюсь повернуть или масштабировать UIImageView, он просто вылетает. Я установил для setMultipleTouchEnabled значение YES.

Сбой вызван: [NSArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]

Я думаю, что ошибка в этой части текста:

     - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    NSArray *allTouches = [touches allObjects];

    UITouch* t;
    if([[event allTouches] count]==1){
        if (CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:0] locationInView:self.view])) {
            t=[[[event allTouches] allObjects] objectAtIndex:0];
            touch1=[t locationInView:nil];
        }
    }else{
        t=[[[event allTouches] allObjects] objectAtIndex:0];
        touch1=[t locationInView:nil];
        t=[[[event allTouches] allObjects] objectAtIndex:1];
        touch2=[t locationInView:nil];
    }
}

-(double)distance:(CGPoint)point1 toPoint:(CGPoint)point2
{
    double deltaX, deltaY;
    deltaX = point1.x - point2.x;
    deltaY = point1.y - point2.y;
    return sqrt(deltaX * deltaX   deltaY * deltaY);
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    CGPoint currentTouch1;
    CGPoint currentTouch2;
    NSArray *allTouches = [touches allObjects];
    UITouch* t;
    float scale,rotation;

    if([[event allTouches] count]==1){
        t=[[[event allTouches] allObjects] objectAtIndex:0];
        if (CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:0] locationInView:self.view]))
        { 
            touch2=[t locationInView:nil];
            Birdie.center=CGPointMake(Birdie.center.x touch2.x-touch1.x,Birdie.center.y touch2.y-touch1.y);
            touch1=touch2;
        }
    }
    else if([[event allTouches] count]==2)
    {
        t=[[[event allTouches] allObjects] objectAtIndex:0];
        currentTouch1=[t locationInView:nil];

        t=[[[event allTouches] allObjects] objectAtIndex:1];
        currentTouch2=[t locationInView:nil];

        double distance1 =  [self distance:currentTouch1 toPoint:currentTouch2];
        double distance2 = [self distance:touch1 toPoint:touch2];

        if (distance2 == 0)
        {
            //handle the case where distance is zero
        }
        else {
            scale =distance1 / distance2;}

        rotation=atan2(currentTouch2.y-currentTouch1.y, currentTouch2.x-currentTouch1.x)-atan2(touch2.y-touch1.y,touch2.x-touch1.x);
        if(isnan(scale)){
            scale=1.0f;
        }
        NSLog(@"rotation %f",rotation);

        NSLog(@"scale %f",scale);

        if (CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:0] locationInView:self.view]) amp;amp;
            CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:1] locationInView:self.view]))
        {

            Birdie.transform=CGAffineTransformScale(Birdie.transform, scale,scale);
            Birdie.transform=CGAffineTransformRotate(Birdie.transform, rotation);
        }
        else // In case of scaling or rotating the background imageView
        {
            imageView.transform=CGAffineTransformScale(imageView.transform, scale,scale);
            imageView.transform=CGAffineTransformRotate(imageView.transform, rotation);
        }

        touch1=currentTouch1;
        touch2=currentTouch2;
    }
}
  

Заранее благодарю!

Ответ №1:

Когда вы выполняете этот вызов:

   if (CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:0] locationInView:self.view]) amp;amp;
            CGRectContainsPoint([Birdie frame], [[allTouches objectAtIndex:1] locationInView:self.view]))
  

Убедитесь, что у вас действительно есть два объекта касания во всех касаниях.

Ответ №2:

если вы работаете с w tableview, не забудьте установить это:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
   if(tableview == self.table1)
    {
      return [mydictionaryObject count]; 
    }

}
  

Комментарии:

1. У вас должно быть другое, return на случай, if если условие равно false.