2015-06-13 23 views
-1

У меня есть изображения в виде коллекции, которые я могу выбрать. Когда я выбираю изображение, выбираются неправильные ячейки изображения. Как только я прокручиваю вниз из камеры, тогда резервное копирование ячейки больше не выбран. Как я могу решить эту проблему?Ячейки не отображаются должным образом при прокрутке

ImageView определяется в раскадровке. активы находятся в библиотеке фотографий.

Это файл PhotoCell.h.

#import <UIKit/UIKit.h> 
#import <AssetsLibrary/AssetsLibrary.h> 

@interface PhotoCell : UICollectionViewCell 

@property(nonatomic,strong) ALAsset * asset; 
@property (nonatomic,weak) IBOutlet UIImageView * PhotoImageView; 

Это мой файл PhotoCell.m.

#import "PhotoCell.h" 
@interface PhotoCell() 

@end 

@implementation PhotoCell 

#pragma mark - User Made Method 
- (void) setAsset:(ALAsset *)asset 
{ 
    // 2 
    _asset = asset; 
    self.PhotoImageView.image = [UIImage imageWithCGImage:[asset thumbnail]]; 
} 

#pragma mark - CollectionView Cell Method 
-(void)prepareForReuse 
{ 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

PhotoCell *cell =(PhotoCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"PhotoCell" forIndexPath:indexPath]; 
ALAsset * asset = self.assets[indexPath.row]; 
cell.asset = asset; 
cell.backgroundColor = [UIColor redColor]; 
} 

#pragma mark - Collection View Delegate 

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 

    //NSLog(@"%@ - %d", NSStringFromSelector(_cmd), indexPath.item);  
    PhotoCell *cell = (PhotoCell *)[collectionView cellForItemAtIndexPath:indexPath]; 
    chkboxBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [chkboxBtn setFrame:CGRectMake(60, 60, 30, 30)]; 
    [chkboxBtn setTag:100]; 
    [chkboxBtn setImage:[UIImage imageNamed:@"success.png"] forState:UIControlStateNormal]; 
    [cell.contentView addSubview:chkboxBtn ]; 
} 

-(void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath{ 

    // This removes the Check Box Button From the Cell After click it again 
    PhotoCell *cell =(PhotoCell *)[collectionView cellForItemAtIndexPath:indexPath]; 
    [[cell.contentView viewWithTag:100] removeFromSuperview]; 

} 
+1

Не могли бы вы потратить больше времени на свой вопрос и попытаться объяснить проблему лучше?В противном случае вы не получите никаких андеров ... – tailec

+0

Возможно, мне нужно потратить некоторое время на мой вопрос, но plz попытается понять. –

ответ

1

Вы не можете добавить флажок в didSelectItemAtIndexPath и удалить его в didDeselectItemAtIndexPath, потому что все клетки будут повторно при прокрутке.

Добавить флажок в вашем PhotoCell, и в cellForItemAtIndexPath функции, сделайте следующее:

if cell.selected { 
    checkbox.hidden = false 
} 
else { 
    checkbox.hidden = true 
} 
+0

Jacky Я не знал, что делать. Не могли бы вы подробно объяснить –

+0

@vikramsingh показать свой код в 'PhotoCell'. – Jacky

+0

Я новичок в iPhone, прошу просить вас, но plz -Jacky, у меня есть ячейка, созданная в раскадровке, поэтому, где мне нужно добавить chekbox в раскадровку или cellforItemAtIndexPath - –

0

Вы должны знать о том, как dequeueReusableCellWithIdentifier работает с Tableview клетки. Когда вы вызываете [tableView dequeueReusableCellWithIdentifier:], он получит ячейку, которая ранее была создана и в настоящее время не используется. Это означает, что объекты UITableCell повторно используются, когда это необходимо.

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

Для решения этой проблемы необходимо сохранить выбранный путь указателя по адресу didSelectItemAtIndexPath и удалить метод didDeselectItemAtIndexPath.

И, наконец, сбросьте [ячейку ячейки &] на cellForItemAtIndexPath источник данных, а затем выделите ячейку, если она указана, если путь указателя содержит в выбранном массиве путей указателя.

См. Приведенный ниже код в качестве примера, который еще не был протестирован.

Добавление кнопки из раскадровки и сделать отверстие, как показано ниже:

@interface PhotoCell : UICollectionViewCell 

@property(nonatomic,strong) ALAsset * asset; 
@property (nonatomic,weak) IBOutlet UIImageView * PhotoImageView; 
@property (nonatomic,weak) IBOutlet UIButton * chkboxBtn; 

@end 

Update фотоэлемент, как показано ниже:

#import "PhotoCell.h" 

@interface PhotoCell() 

- (void)setCheckBoxSelected:(BOOL)selected 

@end 

@implementation PhotoCell 

#pragma mark - User Made Method 
- (void) setAsset:(ALAsset *)asset 
{ 
    // 2 
    _asset = asset; 
    self.PhotoImageView.image = [UIImage imageWithCGImage:[asset thumbnail]]; 
} 
- (void)setCheckBoxSelected:(BOOL)selected 
{ 
    if (selected) { 
     [self.chkboxBtn setImage:[UIImage imageNamed:@"success.png"] forState:UIControlStateNormal]; 
    } else { 
     [self.chkboxBtn setImage:nil forState:UIControlStateNormal]; 
    } 
} 
@end 

И, наконец, изменить ваш контроллер, как показано ниже Добавить свойство NSMutableArray в классе контроллера

@property(nonatomic, strong) NSMutableArray *selectedIndexPaths; 

Инициализация массива при viewDidLoad

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.selectedIndexPaths = [NSMutableArray new]; 
} 

А потом ..

#pragma mark - CollectionView Cell Method 
-(void)prepareForReuse 
{ 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    PhotoCell *cell =(PhotoCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"PhotoCell" forIndexPath:indexPath]; 
    ALAsset * asset = self.assets[indexPath.row]; 
    cell.asset = asset; 
    cell.backgroundColor = [UIColor redColor]; 

    if ([self.selectedIndexPaths containsObject:indexPath]) { 
     [cell setCheckBoxSelected:NO]; 
    } else { 
     [cell setCheckBoxSelected:YES]; 
    } 
} 

#pragma mark - Collection View Delegate 

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 

    [self.selectedIndexPaths addObject:indexPath]; 

    PhotoCell *cell = (PhotoCell *)[collectionView cellForItemAtIndexPath:indexPath]; 
    [cell setCheckBoxSelected:YES]; 
} 

-(void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath{ 

    // This removes the Check Box Button From the Cell After click it again 
    PhotoCell *cell =(PhotoCell *)[collectionView cellForItemAtIndexPath:indexPath]; 
    [cell setCheckBoxSelected:NO]; 
    [self.selectedIndexPaths removeObject:indexPath]; 
} 

@end 

Надеется, что это будет работать.

Спасибо.

Смежные вопросы