2014-01-04 7 views
0

Я работаю с табличным представлением, в котором я добавил 2 кнопки на одну ячейку. Ниже приведен код, который я использовалдействия кнопок ячеек

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    cell.backgroundView =[[UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"list-bg.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0] ]; 
    tickbtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    tickbtn.tag = 200+indexPath.row; 
    [tickbtn setBackgroundImage:[UIImage imageNamed:@"ok_gray.png"]forState:UIControlStateNormal]; 
    [tickbtn addTarget:self action:@selector(addshed:) forControlEvents:UIControlEventTouchUpInside]; 
    tickbtn.frame = CGRectMake(220, 10, 30, 30); 
    [cell.contentView addSubview:tickbtn]; 
    NSLog(@"tickbtn tag %ld",(long)tickbtn.tag); 

    crossbtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    crossbtn.tag = 400+indexPath.row; 
    [crossbtn setBackgroundImage:[UIImage imageNamed:@"delete-gray.png"]forState:UIControlStateNormal]; 
    [crossbtn addTarget:self action:@selector(removeshed:) forControlEvents:UIControlEventTouchUpInside]; 
    crossbtn.frame = CGRectMake(250, 10, 30, 30); 
    [cell.contentView addSubview:crossbtn]; 
    NSLog(@"tickbtn tag %ld",(long)crossbtn.tag); 

    return cell; 
} 

на tickbtn и crossbtn я подаю следующие действия: -

-(IBAction)addshed:(UIControl *)sender 
{ 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:sender.tag-200 inSection:0]; 
    UITableViewCell *cell = (UITableViewCell*)[list_table cellForRowAtIndexPath:indexPath]; 
    UIButton *check1 = (UIButton*)[cell.contentView viewWithTag:indexPath.row+200]; 
    UIButton *check2 = (UIButton*)[cell.contentView viewWithTag:indexPath.row+400]; 
    UIImageView *btnimg1 = [[UIImageView alloc] initWithImage:check1.currentBackgroundImage]; 
    //UIImageView *btnimg2 = [[UIImageView alloc] initWithImage:check2.currentBackgroundImage]; 
    NSLog(@"SHED LIST subviews: %@", btnimg1.image); 
    // Shed_data *sheddata = [[Shed_data alloc] init]; 
    if (btnimg1.image == [UIImage imageNamed:@"ok_gray.png"]) { 
     //btnimg.image = [UIImage imageNamed:@"ok_gray.png"]; 
     [check1 setBackgroundImage:[UIImage imageNamed:@"ok_green.png"]forState:UIControlStateNormal]; 
     [check2 setBackgroundImage:[UIImage imageNamed:@"delete-gray.png"]forState:UIControlStateNormal]; 
     [self addsheddata:sender]; 
     NSLog(@"tickbtn tag %ld",(long)tickbtn.tag); 
    } 
    else if (btnimg1.image == [UIImage imageNamed:@"ok_green.png"]) 
    { 
     [check2 setBackgroundImage:[UIImage imageNamed:@"delete-red.png"]forState:UIControlStateNormal]; 
     [check1 setBackgroundImage:[UIImage imageNamed:@"ok_gray.png"]forState:UIControlStateNormal]; 
     [self removesheddata:sender]; 

} 


} 
-(IBAction)removeshed:(UIControl*)sender 
{ 
    //.…………………….. My functionality 
} 

, но в обоих случаях я получаю значение тега последней ячейки только всякий раз, когда я Я нажимаю кнопки ячейки. Пожалуйста, найдите мою ошибку и помогите мне решить ее. Ваша помощь будет очень заметной.

+0

Можете ли вы показать свой код - (IBAction) добавлено: (UIControl *) отправитель ?? Как вы получаете значение тега? –

+0

Пожалуйста, опишите, что произойдет после того, как действие кнопки будет запущено и закончено? – Mani

+0

Когда я нажимаю кнопку патикулярной ячейки, она меняет цвет ячейки .... – user3131561

ответ

1

Попробуйте этот инструмент для меня. Я только что проверил с моим Xcode 5.

Модификация: 1. Я Создать NSMutableArray с именем _objects (_objects = [[NSMutableArray alloc]initWithObjects:@"one",@"two",@"thre", nil];). и отдать его моему UITableView.

2.Выберите tickBtn и crossBtn, чтобы он был легко различим.

3.Нажмите кнопку нажатой функции до UIControl до UIButton, как и -(IBAction)addshed:(UIButton *)sender, и когда нажата кнопка, я поймаю значение тега и распечатаю его на консоли.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    cell.textLabel.text = [_objects objectAtIndex:indexPath.row]; 

    cell.backgroundView =[[UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"list-bg.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0] ]; 
    tickbtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    tickbtn.tag = 200+indexPath.row; 
    [tickbtn setBackgroundImage:[UIImage imageNamed:@"ok_gray.png"]forState:UIControlStateNormal]; 
    [tickbtn setBackgroundColor:[UIColor blackColor]]; 
    [tickbtn addTarget:self action:@selector(addshed:) forControlEvents:UIControlEventTouchUpInside]; 
    tickbtn.frame = CGRectMake(220, 10, 30, 30); 
    [cell.contentView addSubview:tickbtn]; 
    NSLog(@"tickbtn tag %ld",(long)tickbtn.tag); 

    crossbtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    crossbtn.tag = 400+indexPath.row; 
    [crossbtn setBackgroundImage:[UIImage imageNamed:@"delete-gray.png"]forState:UIControlStateNormal]; 
    [crossbtn addTarget:self action:@selector(removeshed:) forControlEvents:UIControlEventTouchUpInside]; 
    crossbtn.frame = CGRectMake(250, 10, 30, 30); 
    [crossbtn setBackgroundColor:[UIColor greenColor]]; 

    [cell.contentView addSubview:crossbtn]; 
    NSLog(@"tickbtn tag %ld",(long)crossbtn.tag); 

    return cell; 
} 

-(IBAction)addshed:(UIButton *)sender { 
    NSLog(@"add shed %d",sender.tag); 
} 

-(IBAction)removeshed:(UIButton *)sender { 
    NSLog(@"remove %d",sender.tag); 
} 

НОВЫЙ ВОПРОС UPDATE

Did you try with 10 or more cells and try with some continuous scroll? 

И результат

enter image description here enter image description here

Как Другой ответ говорит

[cell addSubview:crossbtn];// -------- Change here --------- 

Позвольте мне прояснить это, поскольку я знаю об этом.

ContentView - это подкласс UITableViewCell. please review this reference и здесь вы можете увидеть, что на самом деле 3 подземелья в UITableViewCell.

+0

Вы уверены, что в этой строке '[cell.contentView addSubview: tickbtn];', кнопка добавит только один раз в ячейку? В случае прокрутки или ячейки повторного использования? – Mani

+0

@ Мани в соответствии с требованием, чтобы он работал нормально. пожалуйста, просмотрите обновленный ответ «Молодой человек» и благодарим вас за комментарий/обсуждение. Удачи – Buntylm

+0

Пробовали ли вы 10 или более ячеек и попробуйте с помощью некоторого непрерывного прокрутки, а также просто откройте журнал на cell.contentview.subviews.count? – Mani

0

Я видел выпуск. Это может привести к ошибке такого типа.

Why do you add subviews again and again to your cell's content view.? 

То есть, для каждого cellForRowAtIndexpath: вызова, кнопка будет добавить к ячейке. В случае dequeueReusableCellWithIdentifier: ваша последняя ячейка может повторно использовать любую другую ячейку во время прокрутки. Это приведет к вашей ошибке. то есть ваша ячейка будет содержать две кнопки. (тег с последней ячейкой и тегом с текущей ячейкой).

В этой строке [cell.contentView addSubview:tickbtn]; вам нужно внести изменения в соответствии с добавлением один раз, а также для crossbtn.

Обновление: Я видел ваш обновленный вопрос. Мое предложение, лучше использовать пользовательскую ячейку. Используйте эту ссылку для how to create custom cell.. Много путаницы в вашем коде. ех. в этой строке UITableViewCell *cell = (UITableViewCell*)[list_table cellForRowAtIndexPath:indexPath];, Это даст неожиданный результат. Не вызывайте метод делегата следующим образом.

0

Вам нужно добавить свою кнопку в подзаголовок contentview. Поэтому используйте этот код ....

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"Cell"; 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     } 

     cell.backgroundView =[[UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"list-bg.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0] ]; 
     tickbtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
     tickbtn.tag = 200+indexPath.row; 
     [tickbtn setBackgroundImage:[UIImage imageNamed:@"ok_gray.png"]forState:UIControlStateNormal]; 
     [tickbtn addTarget:self action:@selector(addshed:) forControlEvents:UIControlEventTouchUpInside]; 
     tickbtn.frame = CGRectMake(220, 10, 30, 30); 
     [cell addSubview:tickbtn];// -------- Change here --------- 
     NSLog(@"tickbtn tag %ld",(long)tickbtn.tag); 

     crossbtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
     crossbtn.tag = 400+indexPath.row; 
     [crossbtn setBackgroundImage:[UIImage imageNamed:@"delete-gray.png"]forState:UIControlStateNormal]; 
     [crossbtn addTarget:self action:@selector(removeshed:) forControlEvents:UIControlEventTouchUpInside]; 
     crossbtn.frame = CGRectMake(250, 10, 30, 30); 
     [cell addSubview:crossbtn];// -------- Change here --------- 
     NSLog(@"tickbtn tag %ld",(long)crossbtn.tag); 

     return cell; 
    } 
0

Ваш код кажется нормально для cellForRowAtIndexpath:.
Ошибка при получении значения тега при нажатии кнопки. Попробуйте изменить этот код: -

-(IBAction)addshed:(UIControl *)sender 
{ 
    //.…………………….. My functionality 

    int selectedRow1 = ((UIControl *)sender).tag; 
    NSLog(@"No. %d", selectedRow1); 

} 
+0

Я обновляю код для добавления сарая, пожалуйста, посмотрите на него ... – user3131561

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