2016-08-02 10 views
1

コレクションビューのセルカスタムクラス自体からセルを更新する必要があるCollectionViewカスタムセルを使用しようとしています。ここでコレクションビュー新しいセルが追加されたときにセルの静的変数が変更される

はカスタムセルクラスはviewCotrollerに私が

、のようにセルを追加してい

Cell_Obj.h

#import <UIKit/UIKit.h> 

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

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

Cell_Obj.m

#import "Cell_Obj.h" 
static NSString *labelTxt ; 
@implementation Cell_Obj{ 

} 

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


    } 
} 


- (id)initWithFrame:(CGRect)frame 
{ 

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


    } 
    return self; 
} 


- (void)awakeFromNib { 

    _label.text = labelTxt; 

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


- (void)updateLabel 
{ 

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

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

    labelTxt = str; 
} 

@end 

です

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

    NSString * txt = [NSString stringWithFormat:@"%d",[GridArray count]]; 
    [cell updateTextLabelName: txt]; 


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


} 

上記のコードの問題は、最初のセルを追加すると、最初のセルのラベルが0であり、それは問題ありませんが、2番目のセルを追加するとタイマー呼び出しが発生します。それはそれぞれ0,1を持っているはずです。

これは、タイマーイベントのように、既に作成されたセルで発生した更新時に、セルオブジェクトが静的変数を共有しているようです。

なぜこれが起こっているのですか、私のアプローチに間違いがありますか?

貴重なご提案をお知らせください。

私はインスタンス変数などの静的変数を移動してきた答えの下に基づいて編集

@implementation Cell_Obj{ 
    NSString *labelTxt ; 
} 

が、内部 updateLabel labelTxtはnilです。どこで updateTextLabelNameをデバッグするときに updateLabelの前に呼び出され、 labelTxtが正しい値を持っています。

答えて

1

これは、コレクションビューがメモリを効率的にするために再表示されるためです。したがって、セルをデキューしたときにawakeFromNibと呼ぶ予定です。コレクションビューdatasource methodsを使用して、コレクションビューコントロールのコンテンツを更新または設定する必要があります。ラベルにデータを設定するにはcellForItemAtIndexPathを実装する必要があります。

+0

私はいくつかの参考資料を提供できますか? – CodeDezk

+0

[https://www.appcoda.com/ios-programming-uicollectionview-tutorial/](https://www.appcoda.com/ios-programming-uicollectionview-tutorial/)を参照してください。 – Lion

+0

私がここに投稿した質問http://stackoverflow.com/questions/38748949/ios-declare-boost-class-as-class-variable – CodeDezk

1

静的変数であるため、すべてのセルインスタンスで共有されます。 labelTxt定義からstaticを削除する方法です。

また、静的な意味は何ですか?タイマーが原因であれば、更新する前にラベルがヌルでないタイマーメソッドをチェックインするだけで、すべての問題が解決されます。

+0

返信いただきありがとうございますが、私は静的キーワードを変更しましたが、依然として同じ結果です。 – CodeDezk

関連する問題