I have tableview and image on cell. I have problem when try to return heightForRowAtIndexPath (image not the same height)
this's my class, it's will be crash when i'm try to scroll down. "2016-07-07 21:44:16.990 xem.vn[1725:25586] * Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]'"
- (void)viewDidLoad {
[listImage addObject:@"https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/leisa_christmas_false_color.png?itok=Jxf0IlS4"];
[listImage addObject:@"https://pixabay.com/static/uploads/photo/2015/10/01/21/39/background-image-967820_960_720.jpg"];
[listImage addObject:@"https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/idcs1426.jpg?itok=Gc_-Q58L"];
[listImage addObject:@"https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/leisa_christmas_false_color.png?itok=Jxf0IlS4"];
[listImage addObject:@"https://pixabay.com/static/uploads/photo/2015/10/01/21/39/background-image-967820_960_720.jpg"];
[listImage addObject:@"https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/idcs1426.jpg?itok=Gc_-Q58L"];
[listImage addObject:@"https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/leisa_christmas_false_color.png?itok=Jxf0IlS4"];
[listImage addObject:@"https://pixabay.com/static/uploads/photo/2015/10/01/21/39/background-image-967820_960_720.jpg"];
[listImage addObject:@"https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/idcs1426.jpg?itok=Gc_-Q58L"];
imageHeights = [[NSMutableArray alloc]init];
[self setDefaultRowHeights];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [listImage count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"newTableViewCell";
newTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = (newTableViewCell *)[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil][0];
}
NSString *imageURL = listImage[indexPath.row];
__weak newTableViewCell *weakCell = cell;
__weak typeof(self) weakSelf = self;
[cell.NewsImageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]]
placeholderImage:[UIImage new]
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
weakCell.NewsImageView.image = image;
NSInteger oldHeight = [imageHeights[indexPath.row] integerValue];
NSInteger newHeight = (int)image.size.height;
if (image.size.width != CGRectGetWidth(weakCell.NewsImageView.bounds)) {
CGFloat ratio = image.size.height / image.size.width;
newHeight = CGRectGetWidth(self.view.bounds) * ratio;
}
if (oldHeight != newHeight) {
imageHeights[indexPath.row] = @(newHeight);
[weakSelf.NewsTableView beginUpdates];
[cell layoutIfNeeded];
[weakSelf.NewsTableView endUpdates];
}
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"Error: %@\nFetching image with url: %@", error, request.URL);
}];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [imageHeights[indexPath.row] integerValue];
}
- (void)setDefaultRowHeights {
imageHeights = [NSMutableArray arrayWithCapacity:listImage.count];
for (int i = 0; i < listImage.count; i++) {
imageHeights[i] = @(self.NewsTableView.rowHeight);
}
}
thank for help!!
I believe the crash is due to your
imageHeightsandlistImagehaving different number of item. AfterviewDidLoadis run, yourlistImagehave 8 items butimageHeights0 item even after running thesetDefaultRowHeights.The
imageHeights = [NSMutableArray arrayWithCapacity:listImage.count]only say imageHeights will hold same count object as listImage, but the number of count inimageHeightsis still 0.I am unsure about if
self.NewsTableViewis setup correctly. Assuming that it is correct, thesetDefaultRowHeightsshould be written like this: