Отображать количество нажатий кнопки в метке для конкретной ячейки, которая является подвидом для uitableview

У меня есть кнопка и метка, которые являются дополнительными представлениями для UITableView.

Изначально значение метки равно 0.

что мне нужно, так это то, что когда я нажимаю кнопку в определенной ячейке, я хочу увеличить значение в той же метке ячейки (как 1) и отобразить это значение в той же метке.

И снова я нажал ту же кнопку ячейки, метка в этой ячейке должна увеличиваться (как 2) и отображать это значение в той же ячейке в UITableView.

Мой код..

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UILabel *Lbl;
UIButton *btn;
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    Lbl =[[UILabel alloc]init];
    [Lbl setFrame:CGRectMake(56, 60, 117, 12)];
    [Lbl setBackgroundColor:[UIColor clearColor]];
    [Lbl setTextAlignment:NSTextAlignmentLeft];
    [Lbl setFont:[UIFont boldSystemFontOfSize:15.0]];
    Lbl.tag=indexPath.row;
    [cell.contentView addSubview:Lbl];

    btn =[UIButton buttonWithType:UIButtonTypeCustom];
    [btn setTitle:@"add" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor colorWithRed:0.7 green:0 blue:0 alpha:1.0] forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor colorWithRed:0.7 green:0 blue:0 alpha:1.0] forState:UIControlStateHighlighted];
    [[btn titleLabel] setFont:[UIFont boldSystemFontOfSize:23]];
    [btn setFrame:CGRectMake(289, 2, 30, 71)];
    btn.tintColor=[UIColor lightGrayColor];
    btn.tag=indexPath.row;
    [btn addTarget:self action:@selector(increaseItemCount:) forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:btn];
} else {
    Lbl =(UILabel *)[cell.contentView viewWithTag:indexPath.row];
    btn =(UIButton *)[cell.contentView viewWithTag:indexPath.row];
}

cell.textLabel.text=@"title";
countLbl.text = [[NSString alloc] initWithFormat:@"%d",showItemCount];

return cell;

}

// button action method
-(void)increaseItemCount:(UIButton *)sender
{    
UITableViewCell *cell = (UITableViewCell *)sender.superview.superview;
NSIndexPath *path = [tableView indexPathForCell:cell];
NSLog(@"row: %d",path.row);
UILabel *countLbl =(UILabel *)[cell.contentView viewWithTag:path.row];
showItemCount=[countLbl.text intValue] + 1;
NSLog(@"%d",showItemCount);
countLbl.text = [[NSString alloc] initWithFormat:@"%d",showItemCount];

}

Я попробовал это: после нажатия значение отображается в других ячейках, и когда я прокручиваю представление таблицы, это значение отображается во всех ячейках.

Любые предложения или код


person Community    schedule 08.08.2013    source источник
comment
Почему Lbl.tag=indexPath.row;?   -  person Meera    schedule 08.08.2013
comment
Я не могу тебя достать. можешь сказать где проблема   -  person    schedule 08.08.2013
comment
Вы получаете правильный счет, но путаетесь с ячейками таблицы? Я предполагаю, что тег лейбла является виновником   -  person Meera    schedule 08.08.2013


Ответы (4)


Если вам нужен исходный код, загрузите его отсюда https://github.com/MasudShuvo/TestCustomTableViewCell.

Я изменил код по вашему требованию.

person shuvo    schedule 08.08.2013
comment
Я попробовал ваш код, он работает. Когда я увеличиваю высоту ячейки до 65, приложение сворачивается. Он показывает ошибку, подобную этой Завершающее приложение из-за необработанного исключения «NSRangeException», причина: «*** -[__NSArrayM objectAtIndex:]: индекс 7 за пределами [0.. 6]» - person ; 08.08.2013
comment
Вы изменили высоту ячейки в моем проекте или в вашем? - person shuvo; 08.08.2013
comment
можете ли вы сказать мне, как остановить уменьшение значения... когда значение достигает 0 - person ; 08.08.2013
comment
Можете ли вы сказать мне, как реализовать долгое нажатие вместе с кликом - person ; 08.08.2013
comment
stackoverflow.com/questions/6179347/uibutton-long-press-event, stackoverflow.com/questions/11200079/long-pressed-uibutton пожалуйста, проверьте эту ссылку, может быть, это будет полезно для вас. - person shuvo; 08.08.2013
comment
Когда я запускаю ваш проект, он работает нормально. при реализации этого в моем проекте приложение разбилось. Он показывает такую ​​ошибку - [__NSArrayM objectAtIndex:]: индекс 0 за пределами пустого массива' - person ; 08.08.2013
comment
Приятно слышать :-). Туалет - person shuvo; 08.08.2013
comment
Привет, Шуво. небольшая помощь ....... Как внедрить searchBar и searchDisplayController в свой проект. - person ; 09.08.2013

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

person Vik    schedule 08.08.2013
comment
Да, вы правы. Я использую одну переменную экземпляра для хранения количества кликов. Можете дать код для решения - person ; 08.08.2013
comment
Вы можете просто использовать переменную экземпляра NSMutableArray, инициализированную @0 для каждого индекса. тогда там, где у вас есть showItemCount = [...], вы можете сделать myInstanceVariable[indexPath.row] = @(myInstanceVariable[indexPath.row] + 1);, а там, где у вас есть countLbl.text = [...], вы можете написать countLbl.text = [NSString stringWithFormat:@"%@",myInstanceVariable[indexPath.row]]; - person Vik; 08.08.2013
comment
Эта строка выдает ошибку, где selectedCells является изменяемым массивом. selectedCells[indexPath.row]=@(selectedCells[indexPath.row] + 1); - person ; 08.08.2013
comment
Да, это я вслепую написал. Вероятно, вам следует обернуть selectedCells[indexPath.row] [... intValue], чтобы он выглядел как = @([selectedCells[indexPath.row] intValue] + 1);. - person Vik; 08.08.2013
comment
Теперь в моем приложении произошла ошибка в этой строке countLbl.text = [NSString stringWithFormat:@%@,selectedCells[indexPath.row]]; я использую эту строку в методе cellForRowAtIndexPath - person ; 08.08.2013
comment
[__NSArrayM objectAtIndex:]: индекс 1 выходит за пределы [0 .. 0]' - person ; 08.08.2013
comment
В моем комментарии я сказал, что вам нужно инициализировать массив @0 для каждого индекса. Это означает, что вы должны сделать что-то вроде [selectedCells addObject:@0] в цикле for для того, сколько у вас ячеек. Или вы также можете сделать в cellForRowAtIndexPath проверку с if([selectedCells count] <= indexPath.row) [selectedCells addObject:@0] до и вместо увеличения содержимого. - person Vik; 08.08.2013

indexPath.row начинается с от 0 до n, мы не устанавливаем тег 0 для метки, и вы используете одну переменную showItemCount, используемую для назначения текста в countLbl, таблица просмотрите ячейку повторного использования, когда она появится, используйте массив для хранения showItemCount для каждой ячейки

person NANNAV    schedule 08.08.2013

пожалуйста, сделайте следующее:

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    selectedIndex=-1;
    //[tblView reloadData];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 2;
}

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   // UILabel *Lbl;
   // UIButton *btn;
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        UILabel *Lbl =[[UILabel alloc]init];
        [Lbl setFrame:CGRectMake(56, 60, 117, 12)];
        [Lbl setBackgroundColor:[UIColor clearColor]];
        [Lbl setTextAlignment:NSTextAlignmentLeft];
        [Lbl setFont:[UIFont boldSystemFontOfSize:15.0]];
        Lbl.tag=indexPath.row;
        Lbl.text=[NSString stringWithFormat:@"%i",0];
        [cell.contentView addSubview:Lbl];

        UIButton *btn =[UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"add" forState:UIControlStateNormal];
        [btn setTitleColor:[UIColor colorWithRed:0.7 green:0 blue:0 alpha:1.0] forState:UIControlStateNormal];
        [btn setTitleColor:[UIColor colorWithRed:0.7 green:0 blue:0 alpha:1.0] forState:UIControlStateHighlighted];
        [[btn titleLabel] setFont:[UIFont boldSystemFontOfSize:23]];
        [btn setFrame:CGRectMake(289, 2, 30, 71)];
        btn.tintColor=[UIColor lightGrayColor];
        btn.tag=indexPath.row;
        [btn addTarget:self action:@selector(increaseItemCount:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:btn];

 NSLog(@"Selected Index:%i",indexPath.row);   
    } else {

       UILabel *Lbl =(UILabel *)[cell.contentView viewWithTag:indexPath.row];
      //UIButton *btn =(UIButton *)[cell viewWithTag:indexPath.row];

        if(indexPath.row==selectedIndex)
        {
             NSLog(@"Selected Index in CellForRowAtIndexPath:%i",indexPath.row);
            Lbl.text=[NSString stringWithFormat:@"%i",[Lbl.text intValue]+1];
        }

    }

   // cell.textLabel.text=@"title";
    //countLbl.text = [[NSString alloc] initWithFormat:@"%d",showItemCount];

    return cell;
}

-(void)increaseItemCount:(UIButton *)sender
{
    selectedIndex=sender.tag;
    [tblView reloadData];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Selected Index:%i",indexPath.row);
}

Я надеюсь, что это поможет вам.

person hpp    schedule 08.08.2013
comment
Я хочу увеличить количество нажатий кнопки - person ; 08.08.2013
comment
Я пытался, но счетчик увеличивается автоматически, когда я прокручиваю представление таблицы, и количество увеличивается в случайных ячейках. - person ; 08.08.2013