2016-08-02 3 views
1

Я пытаюсь использовать специальную ячейку CollectionView, где мне нужно обновить ячейку из собственного класса ячейки коллекции.Collection View Совокупность статических переменных изменяется при добавлении новой ячейки

Вот обычай клеточно-класс

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 

Где в viewCotroller я добавляю клетку, как,

- (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, и это нормально, но когда я добавляю вторую ячейку, и звонок таймера происходит, то и cell1, и cell2 имеют значение метки 1. И он должен иметь 0,1 соответственно.

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

Почему это происходит, есть ли какая-либо ошибка в моем подходе?

Пожалуйста, дайте мне знать ваше ценное предложение.

Редактировать

На основе ниже ответ я переместил статическую переменную в качестве переменной экземпляра,

@implementation Cell_Obj{ 
    NSString *labelTxt ; 
} 

но внутри updateLabellabelTxt равна нулю. Где, когда я отлаживаю updateTextLabelName, вызывается до updateLabel, а labelTxt имеет правильное значение.

ответ

1

Это потому, что collectionview возвращает ячейку, чтобы сделать ее эффективной. Таким образом, время будет называться 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

Поскольку это статическая переменная, она используется всеми экземплярами ячеек. Способ заставить его работать, чтобы удалить static из определения labelTxt.

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

+0

Спасибо за ответ, я изменил статическое ключевое слово, но все тот же результат. – CodeDezk

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