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

How to Change selected Cell data permanently?

我想永久更改 selected 单元格数据,就像我在 didSelectRowAtIndexPath 方法中所做的那样,但问题是当我 select 一行时,单元格数据发生了变化但是当我 select 任何其他行时,前一行变成原来的样子,并且我还想将行保存在一个数组中,这些行已 select 在数组中编辑。这是我现在的代码。

-(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];
}

设置单元格内容的代码应该都在cellForRowAtIndexPath:中。

您应该创建一个真实的数据模型来表示单元格的内容,而不是 time 数组。创建具有 "time" 和 "selected" 等属性的自定义对象(或字典)数组。使用 indexPath.row 找到正确的对象,然后使用它的 "selected" 属性 来决定给它什么样的图像。

didSelectRowAtIndexPath: 设置 "selected" YES 或 NO 并且根本不需要更改单元格。

试试这个,

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

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];
}

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

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

例如,如果您只有标题 (NSStrings),那么一个字符串数组就足够了。但大多数情况下不会,因为您显示的是自定义内容。

看来你这里没有自定义class,所以我就举个例子,你可以轻松翻译。假设您尝试显示 Animal objects.

的列表

创建继承自 NSObject 的 Animal class。 (新文件,class,依此类推)。

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

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

从技术上讲,您还需要 class 到 create/manage/fetch/save 这些 Animal objects 但让我们保持简单,并在 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.
  }

好的,现在我们为您的table视图提供了一组动物(我们的数据)。您可以使用它来创建行。

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 中所做的非常残酷,但我相信您将能够根据您的代码进行调整:)