簡體   English   中英

iOS UICollectionView Cell具有不同的單元格類實例

[英]IOS UICollectionView Cell with different instance of cell class

我正在嘗試為UiCollectionView創建自定義單元格,在這里我需要從后台更新每個單元格。

因此,我為每個名為Cell_Obj的單元格創建了自定義類,並使用計時器從Cell_Obj本身更新了單元格內容。

下面的代碼在單元格上添加圖像,並每2秒增加一個計數器,並將其顯示在新的單元格標簽上。

每次我使用Viewcotroller上的按鈕添加新單元格時,該單元格都會更新,但每個單元格在標簽上都具有相同的值。 它假定具有不同的計數器值,因為每個單元格都是Cell_Obj不同實例,但是每次觸發計時器時, counter值和labelTxt (單元格編號)都具有相同的值。

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

您的每個單元格都不是新單元格。 Cell_Obj *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 該語句重用標識符為“ Cell”的單元格。 要每次創建新的單元格,請不要傳遞indexPath ,而應傳遞nil

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM