2016-08-02 26 views
0

Ich versuche benutzerdefinierte Zelle für UiCollectionView zu erstellen, wo ich jede Zelle aus dem Hintergrund aktualisieren muss.IOS UICollectionView Zelle mit unterschiedlicher Instanz der Zellklasse

So habe ich benutzerdefinierte Klasse für jede Zelle mit dem Namen Cell_Obj erstellt und aktualisiert den Zellinhalt von Cell_Obj selbst mit einem Timer.

Der folgende Code fügt ein Bild in die Zelle ein und inkrementiert einen Zähler in jeder zweiten Sekunde und zeigt ihn auf der neuen Zellenbezeichnung an.

Jedes Mal, wenn ich neue Zelle mit einer Schaltfläche auf einem Viewcotroller hinzufügen die Zelle aktualisiert, aber jede Zelle erhält den gleichen Wert auf dem Etikett. Es wird angenommen, dass der Zählerwert unterschiedlich ist, da jede Zelle eine andere Instanz von Cell_Obj ist, aber der counter Wert und labelTxt (die Zellennummer) den gleichen Wert haben, wenn der Zeitgeber ausgelöst wird.

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 

Antwort

1

Ihre jede Zelle ist nicht neu Zelle. Cell_Obj *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; Diese Anweisung verwendet Ihre Zelle mit der Kennung "Cell". Um jedes Mal eine neue Zelle zu erstellen, übergeben Sie nicht indexPath, sondern geben Sie nil statt.

+0

Ich habe 'nil' verwendet, aber keine Änderung. – CodeDezk

+0

Überprüfen Sie, ob gridArray die richtige Anzahl zurückgibt oder nicht. –

+0

Wenn Sie möchten, kann ich Ihnen den vollständigen Code zur Verfügung stellen. – CodeDezk