2016-08-02 2 views
0

J'essaie de créer une cellule personnalisée pour UiCollectionView où j'ai besoin de mettre à jour chaque cellule de l'arrière-plan.IOS UICollectionView Cellule avec une instance différente de la classe de cellule

J'ai donc créé une classe personnalisée pour chaque cellule nommée Cell_Obj et mettant à jour le contenu de la cellule à partir du Cell_Obj lui-même à l'aide d'une minuterie.

Le code ci-dessous ajoute une image sur la cellule et incrémente un compteur toutes les 2 secondes et l'affiche sur l'étiquette de la nouvelle cellule.

À chaque fois que j'ajoute une nouvelle cellule en utilisant un bouton sur un viewcotroller, la cellule se met à jour mais chaque cellule obtient la même valeur sur l'étiquette. Il suppose avoir une valeur de compteur différente car chaque cellule est une instance différente de Cell_Obj mais la valeur counter et labelTxt (le numéro de cellule) a la même valeur à chaque fois que le temporisateur est déclenché.

ViewController.h

#import <UIKit/UIKit.h> 
#import "Cell_Obj.h" 

@interface ViewController : UIViewController<UICollectionViewDataSource,UICollectionViewDelegate> 

@property (weak, nonatomic) IBOutlet UICollectionView *collection; 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController(){ 

    NSMutableArray *GridArray; 
} 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.collection setDelegate:self]; 
    [self.collection setDataSource:self]; 
    // Do any additional setup after loading the view, typically from a nib. 

     GridArray = [[NSMutableArray alloc] init]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ 
    return GridArray.count; 
} 

// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath: 
- (Cell_Obj *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 
    Cell_Obj *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    // cell.label.text = @"123"; 

    /*cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"AppIcon.png",indexPath.row]];*/ 
    return cell; 

} 

- (void)addImage 
{ 
    Cell_Obj *cell = [[Cell_Obj alloc] init]; 

    // cell.label.text = @"123"; 

    //cell.label.text = [NSString stringWithFormat:@"%d",[dvrGridArray count]-1]; 
    NSString * txt = [NSString stringWithFormat:@"%d",[GridArray count]]; 
    [cell updateTextLabelName: txt]; 


    [GridArray addObject:cell]; 
    [_collection insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:[GridArray count]-1 inSection:0]]]; 


     /* NSMutableArray *arrayWithIndexPaths = [NSMutableArray array]; 
     [arrayWithIndexPaths addObject:cell]; 

     [self.collection insertItemsAtIndexPaths:arrayWithIndexPaths];*/ 

} 


- (IBAction)addClicked:(id)sender { 

    [self addImage]; 

} 
- (IBAction)changeImage:(id)sender { 

    // DVR_Obj *cell = [dvrGridArray objectAtIndex:0]; 
    // [cell changeImage ]; 
    // [_collection reloadData]; 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0]; 
    Cell_Obj *cell = [_collection cellForItemAtIndexPath:indexPath]; 
    [cell changeImage ]; 

} 

#pragma mark Collection view layout things 
// Layout: Set cell size 
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 

    //NSLog(@"SETTING SIZE FOR ITEM AT INDEX %d", indexPath.row); 

    CGRect screenRect = [[UIScreen mainScreen] bounds]; 
    CGFloat screenWidth = screenRect.size.width; 
    CGFloat screenHeight = screenRect.size.height; 

    CGSize mElementSize = CGSizeMake((screenWidth/4)-2, (screenHeight/4)-2); 
    return mElementSize; 
} 
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { 
    return 1.0; 
} 

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { 
    return 1.0; 
} 

// Layout: Set Edges 
- (UIEdgeInsets)collectionView: 
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { 
    // return UIEdgeInsetsMake(0,8,0,8); // top, left, bottom, right 
    return UIEdgeInsetsMake(1,1,1,1); // top, left, bottom, right 
} 

@end 

Cell_Obj.h

#import <UIKit/UIKit.h> 

@interface Cell_Obj : UICollectionViewCell 
@property (weak, nonatomic) IBOutlet UIImageView *imageView; 
@property (weak, nonatomic) IBOutlet UILabel *label; 


- (void)changeImage; 
- (void)updateTextLabelName:(NSString*)str; 
@end 

Cell_Obj.m

#import "Cell_Obj.h" 

static NSString *labelTxt ;// = [[NSString alloc] init]; 
static int counter; 

@implementation Cell_Obj{ 



} 

+ (void)initialize { 
    if (self == [Cell_Obj class]) { 
     labelTxt = [[NSString alloc] init]; 
     counter=0; 

    } 
} 


- (id)initWithFrame:(CGRect)frame 
{ 

    self = [super initWithFrame:frame]; 
    if (self) { 


    } 
    return self; 
} 


- (void)awakeFromNib { 

    _imageView.image = [UIImage imageNamed:@"flower1.png"]; 

    _label.text = labelTxt; 

    [NSTimer scheduledTimerWithTimeInterval:2.0f 
            target:self 
            selector:@selector(updateImage) 
            userInfo:nil 
            repeats:YES]; 
} 


- (void)updateImage 
{ 
    _imageView.image = [UIImage imageNamed:@"AppIcon.png"]; 

    counter++; 
    NSString * txt = [NSString stringWithFormat:@"%@-%d",labelTxt,counter]; 
    _label.text = txt; 
} 

- (void)updateTextLabelName :(NSString*)str 
{ 

    labelTxt = str; 
} 



@end 

Répondre

1

Votre chaque cellule n'est pas nouvelle cellule. Cell_Obj *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; cette instruction réutilise votre cellule avec l'identificateur "Cell". Pour créer une nouvelle cellule à chaque fois, ne passez pas indexPath, passez nil à la place.

+0

J'ai utilisé 'nil' mais pas de changement. – CodeDezk

+0

Vérifiez si gridArray renvoie le nombre correct ou non. –

+0

Si vous avez besoin je peux vous fournir le code complet. – CodeDezk