Надеюсь, я прав.Сейчас у меня нет Mac, чтобы проверить это, но я видел некоторые ошибки в коде.
В MainViewController при повторном использовании ячейки вы просто возвращаете старую ячейку без каких-либо изменений.Я думаю, именно поэтому вы получаете 0-7, а затем снова 0-1.Скорее всего, на экране видны 7 ячеек, и когда вы начинаете прокручивать, вы просто возвращаете снятые с очереди ячейки (которые равны 0 и 1, потому что вы прокручиваете вниз, и эти ячейки находятся вне экрана).При повторном использовании ячейки следует повторно инициализировать asyncImageView с изображением для текущего индекса.Я скопирую и вставлю некоторый код, но это скорее в качестве руководства, потому что я не могу скомпилировать / протестировать его:
Кроме того, вы присоединяете один и тот же тег к нескольким asyncImageViews, которые вы создаете в одной и той же ячейке.Вы не сможете вернуть их все.Прикрепите идентификаторы, основанные на индексе или чем-то.
РЕДАКТИРОВАТЬ: Вот как я получил это работает.Тем не менее, я действительно не понимаю логику вашего кода, когда вы размещаете кнопки в ячейке.
Кроме того, все еще существует проблема с AsyncImageView.Во время загрузки нового изображения оно отображает старое, поэтому вы увидите, что при прокрутке старые изображения сначала появляются с индикатором активности, а затем появляются новые изображения.У вас должно быть состояние загрузки для AsyncImageView, где он отображает что-то нейтральное.
Кроме того, я действительно доволен методом тегирования, но он работает :) Хорошо, достаточно разговоров, вот код, который я изменил:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
AsyncImageView *asyncImageView = nil;
int section = indexPath.section;
NSMutableArray *sectionItems = [sections objectAtIndex:section];
int n = ([sectionItems count]) ;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
// Create a new cell
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
int i=0;
int f=0;
while (i < [sectionItems count])
{
int yy = 4 +f*74;
//number of items per section 2
for(int j=0; j<[sectionItems count]; j++)
{
Item *item = [sectionItems objectAtIndex:j];
int buttonX = 10;
if (j != 0)
buttonX = 203;
NSLog(@"+++++++++++++++++++++++++++++++");
NSLog(@"image :: %d :: %@", j, item.image);
NSLog(@"+++++++++++++++++++++++++++++++");
CGRect frame;
frame.origin.x = buttonX;
frame.origin.y = yy;
frame.size.width = 107;
frame.size.height = 107;
asyncImageView = [[[AsyncImageView alloc] initWithFrame:frame] autorelease];
asyncImageView.backgroundColor = [UIColor clearColor];
asyncImageView.tag = ASYNC_IMAGE_TAG + f * 100 + j;
//asyncImageView.opaque = YES;
[cell.contentView addSubview:asyncImageView];
i++;
}
f = f+1;
}
}
else
{
NSLog(@"cell != nill %@", cell);
}
int i=0;
int f=0;
while (i < [sectionItems count])
{
//number of items per section 2
for(int j=0; j<[sectionItems count]; j++)
{
Item *item = [sectionItems objectAtIndex:j];
asyncImageView = (AsyncImageView *) [cell.contentView viewWithTag:ASYNC_IMAGE_TAG + f * 100 + j];
[asyncImageView loadImageFromURL:[NSURL URLWithString:item.image]];
i++;
}
f = f+1;
}
return cell;
}
EDIT2 : я быстро исправил AsyncImageView, чтобы удалить старое изображение при загрузке нового.Я просто опубликую некоторые выдержки из кода с изменениями:
-(void)loadImageFromURL:(NSURL*)url {
// ADD THE FOLLOWING LINES
// Remove the old image (tagged with 1234)
[[self viewWithTag:1234] removeFromSuperview];
// END ADD
if (connection != nil) {
NSLog(@"connection != nil");
[connection cancel];
[connection release];
Немного ниже в том же методе, где вы создаете изображение из кэша, добавьте следующие строки:
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.autoresizingMask =
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// ADD THE NEXT LINE
imageView.tag = 1234; // add this line
// END ADD
[self addSubview:imageView];
А в другой функции, - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection
, где вы создаете новое изображение, просто добавьте тег снова:
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.autoresizingMask =
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// ADD THE NEXT LINE
imageView.tag = 1234;
// END ADD
[self addSubview:imageView];
imageView.frame = self.bounds;