Помогите мне ... Завершение приложения из-за необработанного исключения 'NSRangeException', - PullRequest
1 голос
/ 22 февраля 2011
- (void)viewDidLoad {
    [super viewDidLoad];
    NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] 
         initWithTarget:self selector:@selector(loadImage) object:nil];
    [queue addOperation:operation]; 
    [operation release];

    NSMutableArray *_array = [[NSMutableArray alloc] initWithCapacity:10000];
    self.array = _array;
    [_array release];
}

- (void)loadImage
{
  for(int i = 0;i < [appDelegate.ArrParseData count]; i++ )
    {   
        NSLog(@" count %i",i);

        // Configure the cell...
        XMLTags *xmltag = [appDelegate.ArrParseData objectAtIndex:i];
        NSString *Img_id, *Img_name, *DynamicImgUrl;
        Img_id = xmltag.equip_id;
        Img_name = xmltag.image;

        DynamicImgUrl = [NSString stringWithFormat:@"http://testetete.com/pics/equipment/%@/%@",Img_id, Img_name];

        NSURL *ImageUrl = [NSURL URLWithString:DynamicImgUrl];
        NSLog(@" ccxvount %@",ImageUrl);
        UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:ImageUrl]]; 
        NSLog(@" ccxvount %i",i);

        [self.array addObject:image];

        NSLog(@" ccxvount %i",i);
    }



       [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
    }

    // Customize the appearance of table view cells.
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }




        UIImageView *top_img = [[UIImageView alloc] initWithFrame:CGRectMake(10, 25, 75, 80)];
        CGRect rect = top_img.frame;

        rect.size.height = 60;
        rect.size.width = 60;
        top_img.frame = rect;

        // the imageView holds the image myImg
        top_img.image = [self.array objectAtIndex:indexPath.row];

        //cell.imageView.image=image;
        [cell.contentView addSubview:top_img];




        return cell;
    }

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        // Return the number of sections.
        return 1;
    }


    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        // Return the number of rows in the section.
        return [appDelegate.ArrParseData count];
    }

когда я выполняю приведенный выше код, мое приложение вылетает со следующей ошибкой ..

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x026cc919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0281a5de objc_exception_throw + 47
    2   CoreFoundation                      0x026c2465 -[__NSArrayM objectAtIndex:] + 261
    3   AgSearch                            0x00006f80 -[EquipmentViewController tableView:cellForRowAtIndexPath:] + 752
    4   UIKit                               0x00345a3f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 619
    5   UIKit                               0x0033bad2 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
    6   UIKit                               0x0035040c -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
    7   UIKit                               0x003484bc -[UITableView layoutSubviews] + 242
    8   QuartzCore                          0x024620d5 -[CALayer layoutSublayers] + 177
    9   QuartzCore                          0x02461e05 CALayerLayoutIfNeeded + 220
    10  QuartzCore                          0x0246164c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 302
    11  QuartzCore                          0x024612b0 _ZN2CA11Transaction6commitEv + 292
    12  QuartzCore                          0x02468f5b _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99
    13  CoreFoundation                      0x026add1b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
    14  CoreFoundation                      0x02642987 __CFRunLoopDoObservers + 295
    15  CoreFoundation                      0x0260bc17 __CFRunLoopRun + 1575
    16  CoreFoundation                      0x0260b280 CFRunLoopRunSpecific + 208
    17  CoreFoundation                      0x0260b1a1 CFRunLoopRunInMode + 97
    18  GraphicsServices                    0x02f312c8 GSEventRunModal + 217
    19  GraphicsServices                    0x02f3138d GSEventRun + 115
    20  UIKit                               0x002e3b58 UIApplicationMain + 1160
    21  AgSearch                            0x0000206c main + 102
    22  AgSearch                            0x00001ffd start + 53
    23  ???                                 0x00000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'

Любая помощь будет принята с благодарностью ....

Спасибо за нетпомощь

Ответы [ 4 ]

4 голосов
/ 22 февраля 2011

есть ли в массиве какие-либо данные, когда вы показываете таблицу?если вы задаете число ячеек по умолчанию больше 0, и в массиве нет данных ... тогда вы получите ошибку, которую вы описали.

'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array'

РЕДАКТИРОВАТЬ: в

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return [appDelegate.ArrParseData count];
}

вы не должны возвращать количество элементов из appDelegate.ArrParseData, потому что, если этот массив заполнен данными, вы получите число X больше 0.

вcellForRowAtIndexPath вы запрашиваете информацию по индексу X, но self.array еще не заполнен данными, поскольку вы вызываете метод loadImage async.

Вы должны вернуть [self.array count]; вМетод numberOfRowsInSection.

0 голосов
/ 21 августа 2015

может быть, кто-то совершит такую ​​глупую ошибку, как я: - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath и попробуйте сделать что-то вроде этого: SomeObject = [SomeContainer objectAtIndex:indexPath]; Или даже попытаться быть умным с помощью приведения: SomeObject = [SomeContainer objectAtIndex:(int)indexPath]; НЕПРАВИЛЬНО

ни за что ... ПРОСТО не забудьте получить индекс, вам нужно позвонить indexPath.row !!!!!

0 голосов
/ 20 марта 2011

Ваш метод количества строк обращается к массиву счетчиков, отличному от того, который содержит ваше изображение, не так ли?

Если вы выполнили этот код не одновременно, у вас не было бы этой ошибки. Проблема возникает, когда поток, который должен заполнить ваш массив изображений, работает медленнее, чем основной.

Таким образом, вашим лучшим решением было бы проверить размер массива изображений перед тем, как получить к нему доступ, и если вы хотите, вы можете отправлять reloadRowsAtIndexPaths: withRowAnimation: сообщение вашему tableView каждый раз, когда вы получаете новое изображение. Это даст вам хороший эффект загрузки.

Надеюсь, я достаточно ясно.

До встречи!

0 голосов
/ 22 февраля 2011

Я не думаю, что вы показываете весь код, который вам нужно показать - трассировка показывает, что исключение происходит некоторое время в cellForRowAtIndexPath. Похоже, вы обращаетесь к массиву, который ничего не содержит - вы полностью уверены, что массив был загружен к тому времени, когда вы пытаетесь его использовать?

Вероятно, вы знаете, сколько ячеек будет , будет , и правильно сообщаете об этом через numberOfRowsInSection, но вы не заполнили массив к тому времени, когда он требуется. Вам нужно что-то вроде отображения заполнителей, пока загрузка не будет завершена, оставить изображения ноль (пустыми) до готовности, сделать последовательной загрузку / просмотр данных, получить загрузку в фоновом режиме раньше или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...