2013-08-14 3 views
0

Я создал customCell с UIButton и UILabelCustomCell значение метки не изменяет

код здесь:

ItemViewController.h: 

@interface ItemViewController : UIViewController<UITableViewDelegate,UITableViewDataSource> 
{ 
    NSArray *arr; 
    IBOutlet ItemCustomCell *itemCell; 
} 

@property(nonatomic,retain)IBOutlet UITableView *tblItem; 

ItemViewController.m 

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *simpleTableIdentifier = @"SimpleTableItem"; 

     ItemCustomCell *cell = (ItemCustomCell *) [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

     if (cell == nil) { 
      [[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil]; 
      cell = itemCell; 
     } 

     cell.btnPlus.tag=indexPath.row; 
     [cell.btnPlus addTarget:self action:@selector(incrementValue:) forControlEvents:UIControlEventTouchUpInside]; 

     return cell; 
    } 

    -(void)incrementValue:(UIButton *)btnAdd 
    { 
     NSLog(@"btn%d",btnAdd.tag); 
     NSIndexPath *indexPath=[NSIndexPath indexPathForRow:btnAdd.tag inSection:0]; 
     ItemCustomCell *cell = (ItemCustomCell*)[tblItem cellForRowAtIndexPath:indexPath]; 
     cell.lblCount.text=[NSString stringWithFormat:@"%d",[cell.lblCount.text intValue]+1]; 

    } 

ItemCustomCell.h 

@interface ItemCustomCell : UITableViewCell 
{ 


} 

@property(nonatomic,strong)IBOutlet UIButton *btnPlus; 
@property(nonatomic,assign)IBOutlet UILabel *lblCount; 

Значение по умолчанию метки равно 1. При нажатии на кнопку она показывает следующее значение.

Когда я прокручиваю вверх или вниз значение таблицы tableView сбрасывается на 1. Что я здесь делаю неправильно?

+0

Что такое itemCell? – vikingosegundo

+0

, где вы устанавливаете свой пользовательский элемент lblCount ячейки 1? –

+0

ItemCustomCell.xib – user2681789

ответ

3

Для customCell, необходимо указать его идентификатор повторного использования и его имя класса в XIb и нагрузки в камеру для повторного использования:

cell = [[[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil] lastObject]; 

EDIT

Это лучше использовать IBOutlet и делегировать выполните действие внутри CustomCell, затем используйте тег.

//ItemCustomCell.h 
@class ItemCustomCell; 
@protolcol ItemCustomCellDelegate 
    -(void) clickPlusButtonInsideCell:(ItemCustomCell *)cell; 
@end 
@interface ItemCustomCell 
@property(weak, nonatomic) id<ItemCustomCellDelegate> delegate; 
//Hookup with your view in Xib 
@property (weak, nonatomic) IBOutlet UILabel *label; 
-(IBACtion)clickPlusBut:(id)sender; 
@end 
//ItemCustomCell.m 
-(IBACtion)clickPlusBut:(id)sender{ 
[self.delegate clickPlusButtonInsideCell:self]; 
} 

Использование

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *simpleTableIdentifier = @"SimpleTableItem"; 

    ItemCustomCell *cell = (ItemCustomCell *) [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    if (cell == nil) { 
cell = [[[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil] lastObject]; 
    } 
    cell.delegate = self; 

    return cell; 
} 

-(void) clickPlusButtonInsideCell:(ItemCustomCell *)cell{ 
    cell.label.text = @"something"; 
} 
+0

что такое последний объект? – user2681789

+0

Загрузка ниба будет загружаться в массив, вам нужно получить объект в нем (вид). У вас есть только 1 вид в вашем наконечнике. Затем можно использовать lastObject или ObjectAtIndex: 0 –

2

Проблема заключается в том, что вы устанавливаете значение наклейки из функции, связанной с вашей кнопкой.

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

Итак, если вы не сохраните значение своей метки, вы потеряете ее каждый раз, когда ваша камера выйдет из экрана.

Добавьте что-нибудь (например, массив), чтобы сохранить значение для каждого из ваших ярлыков. увеличьте значение, сохраненное в то же время, когда вы увеличиваете отображаемое значение.

0

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

Сейчас ваше значение хранится в метке, но при обновлении вы теряете данные и сбрасывает значение по умолчанию 1.

Так что в вашем cellForTableRow установить текст надписи на значение из массив. И во втором методе вы увеличиваете значение, хранящееся в массиве, а затем перезагружаете данные (или меняете метку вручную, как сейчас).

0

При использовании UITableViewCell от nib вы должны следовать следующему подходу.

if (cell == nil) { 
    NSArray *topLevelArray = [[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil]; 

     cell = [topLevelArray objectAtIndex:0]; 
    } 
0

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

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

Если состояние является временным и не нужно хранить в объекте, вам нужно сохранить это состояние где-то. Есть несколько ответов об использовании NSArray для хранения этого состояния. Я лично предпочитаю использовать NSDictionary с indexPath в качестве ключа.Поскольку NSIndexPath соответствует NSCopying, он может использоваться как ключ к NSDictionary.

0

Обнаружено решение, в numberOfSectionInTableView Мне нужно применить условие, основанное на состоянии таблицы, и соответственно изменить значение метки. Я использовал пейджинг, так что это решение.

Если кто-то еще не использует пейджинг в представлении таблицы, то просто установите значение перед отправкой запроса JSON и примените условие на основе значения в numberOfSectionInTableView, и оно будет работать.

0

Ваш код отображает следующее значение, потому что вы увеличиваете значение при нажатии кнопки.

cell.lblCount.text=[NSString stringWithFormat:@"%d", [cell.lblCount.text intValue]+1]; 

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

Вам нужно больше узнать о том, как это работает и как использовать многоразовую ячейку. Посмотрите эту статью A Closer Look at Table View Cells

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