滚动tableview后,UITableViewCellAccessoryCheckmark消失了

时间:2015-09-30 07:03:57

标签: ios objective-c uitableview

我正在进行tableview多重选择,取消选择。

我有3个表视图(tableview有标签400我需要多个选择和 取消选择 - > alllMumbaiTableview)

我的问题:当我选择多行时,UITableViewCellAccessoryCheckmark会消失             滚动tableview后。但在这里,我可以看到那些细胞仍在             仅选择状态但不显示UITableViewCellAccessoryCheckmark

enter image description here

滚动后我的表格看起来像这样

enter image description here

这是我的代码

@property (nonatomic, strong) NSMutableArray *arrIndexpaths;

UItableview方法 -

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

       static NSString *simpleTableIdentifier = @"SimpleTableItem";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];


         if(tableView.tag == 100)
        {
              cell.textLabel.text = [typeArray objectAtIndex:indexPath.row];
        }
        else if (tableView.tag == 300)
        {
              cell.textLabel.text = [specialityArray objectAtIndex:indexPath.row];
        }
        else if (tableView.tag == 400)
        {
                if (cell == nil)
                {

                    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];

                }
                if ([self.arrIndexpaths containsObject:[NSIndexSet indexSetWithIndex:indexPath.row]])
                {
                    cell.accessoryType = UITableViewCellAccessoryCheckmark;
                }
                else
                {
                    cell.accessoryType = UITableViewCellAccessoryNone;
                }

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

        }
    return  cell;

 }

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
   {


        if(tableView.tag == 100)
        {
            _typeTextfield.text=[typeArray objectAtIndex:indexPath.row];
            _typeTableview.hidden = YES;
        }
        else if (tableView.tag == 300)
        {
            _specialityTextield.text=[specialityArray objectAtIndex:indexPath.row];
            _specialityTableview.hidden = YES;
        }
        else if (tableView.tag == 400)
        {

            UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
            tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
            [self.arrIndexpaths addObject:[NSIndexSet indexSetWithIndex:indexPath.row]];
        }

 }
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
  {
    if (tableView.tag == 400)
    {
        UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
        tableViewCell.accessoryType = UITableViewCellAccessoryNone;
        [self.arrIndexpaths removeObject:[NSIndexSet indexSetWithIndex:indexPath.row]];

    }

  }

我想要的是什么:

1)即使在滚动tableview之后我也想要UITableViewCellAccessoryCheckmark(但是当我选择一个时,不应该选择其他行。我以前的问题 - > Selecting one UITableViewCell selects the other cell after scrolling

2)我只需要将所有选择的值都放入单个数组中。

6 个答案:

答案 0 :(得分:2)

我想建议使用每个不同的小区标识符。我不知道如何设置tableviews布局,但它看起来tableviewcell队列替换了上面实现的其他单元格。

static NSString *simpleTableIdentifier = @"SimpleTableItem";

if(tableView.tag == 100)
{
    simpleTableIdentifier = @"SimpleTableItem";
}
else if (tableView.tag == 300)
{
    simpleTableIdentifier = @"SimpleTableItem1";
}
else if (tableView.tag == 400) {

    simpleTableIdentifier = @"SimpleTableItem2";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

更新最终

#import "ViewController.h"

@interface ViewController () <UITableViewDataSource, UITableViewDelegate> {
    NSArray *tmpArray;
}

@property(nonatomic, weak) IBOutlet UITableView *tableView1, *tableView2, *tableView3;

@end

@implementation ViewController

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

    tmpArray = @[[NSNumber numberWithInt:2],[NSNumber numberWithInt:3]];

    [self.view bringSubviewToFront:self.tableView1];
    [self.view bringSubviewToFront:self.tableView2];
    [self.view bringSubviewToFront:self.tableView3];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


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

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

    static NSString *simpleTableIdentifier = @"SimpleTableItem";

    if (self.tableView1 == tableView)
    {
        simpleTableIdentifier = @"SimpleTableItem";
    }
    else if (self.tableView2 == tableView)
    {
        simpleTableIdentifier = @"SimpleTableItem1";
    }
    else if (self.tableView3 == tableView) {

        simpleTableIdentifier = @"SimpleTableItem2";
    }


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
    }

    if (self.tableView1 == tableView)
    {
        cell.textLabel.text = @"tableView1";
    }
    else if (self.tableView2 == tableView)
    {
        cell.textLabel.text = @"tableView2";
    }
    else if (self.tableView3 == tableView) {

        if ([tmpArray objectAtIndex:0] == [NSNumber numberWithInt:(int)indexPath.row] ||
            [tmpArray objectAtIndex:1] == [NSNumber numberWithInt:(int)indexPath.row] ) {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            cell.accessoryType = UITableViewCellAccessoryNone;
        }

        cell.textLabel.text = @"tableView3";
    }

    return  cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 70;
}

答案 1 :(得分:0)

有很多可以解决这个问题。

但最简单的方法是不要在cellforrowatindexpath中重复使用单元格。

每次创建新的单元格实例&amp;我希望你们两个问题都能解决。

 UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];

我希望它适合你,它适合我。

答案 2 :(得分:0)

我通过使用按钮并在选择/取消选择时更改其图像来实现相同的功能,下面是可以帮助您的代码。

cell.btnCheckMark.tag = indexPath.row;

    [cell.btnCheckMark addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

    NSString *str1 = [[NSString alloc]init];
    str1 = [NSString stringWithFormat:@"%d",cell.btnCheckMark.tag];


    //str2 = [NSString stringWithFormat:@"%@",cell.lblText.text];

    if ([arrSelect containsObject:str1]) {
        cell.btnCheckMark.selected=YES;
        str2 = [NSString stringWithFormat:@"%@",cell.lblText.text];
    }else{
        cell.btnCheckMark.selected=NO;
    }

- (无效)buttonPressed:(ID)发送方{

UIButton *btn = (UIButton *)sender;

btn.selected=!btn.selected;

str= [NSString stringWithFormat:@"%d",btn.tag];
displayValues = [NSString stringWithFormat:@"%@",[arrName objectAtIndex:[str integerValue]]];

if (btn.selected) {
    [arrSelect addObject:[NSString stringWithString:str]];
   // NSLog(@"Name: %@",[arrName objectAtIndex:[str integerValue]]);
}
else{
    [arrSelect removeObject:[NSString stringWithString:str]];
   // NSLog(@"%@",[arrName objectAtIndex:[str integerValue]]);

}

}

答案 3 :(得分:0)

shrikant

我认为这是因为可重复使用的细胞而发生的。

你试试

replce

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

 UITableViewCell *cell = nil;
  

我认为这样可以正常工作。

答案 4 :(得分:0)

我正在更新您的代码。

在ViewDidiLoad方法中 -

  if (self.arrIndexpaths) {
    self.arrIndexpaths = [[NSMutableArray alloc] init];
}

首次更新cellForRowAtIndexPath方法:

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  {static NSString *simpleTableIdentifier = @"SimpleTableItem";
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier forIndexPath:indexPath];//Update


     if(tableView.tag == 100)
    {
          cell.textLabel.text = [typeArray objectAtIndex:indexPath.row];
    }
    else if (tableView.tag == 300)
    {
          cell.textLabel.text = [specialityArray objectAtIndex:indexPath.row];
    }
    else if (tableView.tag == 400)
    {
          /*  if (cell == nil)
            {

                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];

            }*///Update
            if ([self.arrIndexpaths containsObject:indexPath])//Update
            {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
            }
            else
            {
                cell.accessoryType = UITableViewCellAccessoryNone;
            }

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

    }
return  cell;}

第二次更新DidSelectRowIndexPath方法

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
if(tableView.tag == 100)
    {
        _typeTextfield.text=[typeArray objectAtIndex:indexPath.row];
        _typeTableview.hidden = YES;
    }
    else if (tableView.tag == 300)
    {
        _specialityTextield.text=[specialityArray objectAtIndex:indexPath.row];
        _specialityTableview.hidden = YES;
    }
    else if (tableView.tag == 400)
    {

        UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:[tableView indexPathForSelectedRow]];//Update
           if ([self.arrIndexpaths containsObject:indexPath])//Update
          {
            tableViewCell.accessoryType = UITableViewCellAccessoryNone;
             [self.arrIndexpaths removeObject:indexPath];
          }
         else
          {
            tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
            [self.arrIndexpaths addObject:indexPath];
          } 
         }
        }

希望上面的代码能为您提供帮助。

答案 5 :(得分:0)

我必须为每张桌子使用不同的标识符。为每个tableview返回单元格,然后它为我工作

更新代码

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

      if(tableView.tag == 100)
    {

        static NSString *simpleTableIdentifier = @"SimpleTableItem1";

        UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }


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

        return cell;

    }
    else if (tableView.tag == 300)
    {

        static NSString *simpleTableIdentifier = @"SimpleTableItem2";

        UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }


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

        return cell;


    }
    else
    {

            static NSString *simpleTableIdentifier = @"SimpleTableItem3";

            UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];

            if (cell == nil)
            {

                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];

            }

            if ([self.arrIndexpaths containsObject:[NSIndexSet indexSetWithIndex:indexPath.row]])
            {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
            }
            else
            {
                cell.accessoryType = UITableViewCellAccessoryNone;
            }

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

            return cell;

        }



}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{


    if(tableView.tag == 100)
    {
    _typeTextfield.text=[typeArray objectAtIndex:indexPath.row];
    _typeTableview.hidden = YES;
    }
    else if (tableView.tag == 300)
    {
        _specialityTextield.text=[specialityArray objectAtIndex:indexPath.row];
        _specialityTableview.hidden = YES;
    }
    else if (tableView.tag == 400)
    {


        UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
        tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;

        [self.arrIndexpaths addObject:[NSIndexSet indexSetWithIndex:indexPath.row]];
    }

}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath: (NSIndexPath *)indexPath
{
    if (tableView.tag == 400)
   {
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryType = UITableViewCellAccessoryNone;
    [self.arrIndexpaths removeObject:[NSIndexSet indexSetWithIndex:indexPath.row]];

   }

}