如何永久更改选定的单元格数据?

时间:2015-05-21 11:59:18

标签: ios objective-c uitableview didselectrowatindexpath

我想像我在didSelectRowAtIndexPath方法中那样永久地更改所选的单元格数据,但问题是当我选择一行时单元格数据会发生变化但是当我选择任何其他行时,前一个变为它是,我也想保存数组中的行,这些行是在数组中选择的。这是我现在的代码。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
@try {
    static NSString *cellidentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellidentifier];
    if(cell == nil)
    {
        NSArray *cellObjects = [[NSBundle mainBundle] loadNibNamed:@"Cell" owner:self options:nil];
        cell = (UITableViewCell*) [cellObjects objectAtIndex:0];
    }

    UILabel *label;
    long row = [indexPath row];

    label = (UILabel *)[cell viewWithTag:10];

    label.text =time[row];
    label.textColor = [UIColor blackColor];
    cell.imageView.image = [img_clock_blue objectAtIndex:indexPath.row];
    cell.backgroundColor = [UIColor yellowColor];

    [tableView setSeparatorInset:UIEdgeInsetsZero];

    //int hecValue;
    return cell;
}
@catch (NSException *exception)
{
    NSLog(@"%@",exception);
}
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView reloadData];
UITableViewCell *cell1 = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
cell1.imageView.image = [UIImage imageNamed:@"1_red.png"];
cell1.backgroundColor = [UIColor clearColor];
}

3 个答案:

答案 0 :(得分:1)

你正在修改单元格,这是一个坏主意。您需要修改获取数据的位置。

在您的didSelectRowAtIndexPath中找到数组中的objectAtIndex:,根据您的意愿修改它,然后重新加载表格。

如果您只有标题(NSStrings),那么字符串数组就足够了。但大多数时候它不会,因为你正在展示一些自定义的东西。

看起来你这里没有自定义类,所以我只想做一个你可以轻松翻译的例子。假设您正在尝试显示Animal个对象的列表。

创建继承自NSObject的Animal类。 (新文件,类等)。

Animal.h文件中添加您需要的属性,例如

@property (weak, nonatomic) NSString *name;
@property (nonatomic) int size;
@property (nonatomic) int weight;
@property (weak, nonatomic) NSString *countryOfOrigin;

从技术上讲,您还需要一个类来创建/管理/获取/保存这些Animal个对象,但让它保持简单并在控制器的viewDidLoad中进行。

- (void)viewDidLoad{
   [super viewDidLoad];

   Animal *myAnimal = [[Animal alloc]init];
   myAnimal.name = @"Lion";
   myAnimal.size = 13;
   myAnimal.weight = 100;
   myAnimal.countryOfOrigin = @"NoIdeaHahahah";

    // You can hardcode a couple like that, and add them to your array used for your tableview data. Basically we just want some of your custom objects in an array, for your tableview.
  }

好的,现在我们为您的tableview提供了一个Animal数组(我们的数据)。您可以使用它来创建行。

cellForRow中创建单元格时,只需从:

开始
Animal *animal = [myArray objectAtIndex:indexPath.row];

然后使用该动物的属性喂养您的细胞

cell.titleLabel.text = animal.name;

例如。

didSelect你可以修改那个特定的动物,就像我在这个答案的开头所说的那样:)

Animal *animal = [myArray objectAtIndex:indexPath.row];
animal.name = @"IJustChangedTheName";   

[self.tableView reloadData];

这一切都是常见的做法,除了我们在viewDidLoad中所做的非常残酷的事情,但我相信你能够将其改编为你的代码:)

答案 1 :(得分:0)

设置单元格内容的代码应全部在cellForRowAtIndexPath:

您应该创建一个真实的数据模型来表示单元格的内容,而不是time数组。使用“time”和“selected”等属性创建自定义对象(或词典)数组。使用indexPath.row查找正确的对象,然后使用其“selected”属性来决定提供哪种图像。

didSelectRowAtIndexPath:设置“已选择”是或否,根本不需要更改单元格。

答案 2 :(得分:0)

试试这个,

  1. 在视图控制器中创建NSMutableArray @property。让我们说selectedIndexArray
  2. 通过viewDidLoad
  3. self.selectedIndexArray = [[NSMutableArray alloc] init];中初始化数组 cellForRowAtIndexPath方法

    中的

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //other codes
        if ([self.selectedIndexArray containsObject:indexPath]) {
             cell.imageView.image = [UIImage imageNamed:@"1_red.png"]; //assumes all selected cells have same image
        } else {
    
             cell.imageView.image = [img_clock_blue objectAtIndex:indexPath.row];
        }
    
        .....//other code
    }
    
    didSelectRowAtIndexPath:

    中的

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [self.selectedIndexArray addObject:indexPath];
        [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
    }