如何永久更改选定的单元格数据?
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 并且根本不需要更改单元格。
试试这个,
- 在视图控制器中创建一个
NSMutableArray
@property
。让我们说 selectedIndexArray
- 通过
self.selectedIndexArray = [[NSMutableArray alloc] init];
初始化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
中所做的非常残酷,但我相信您将能够根据您的代码进行调整:)
我想永久更改 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 并且根本不需要更改单元格。
试试这个,
- 在视图控制器中创建一个
NSMutableArray
@property
。让我们说selectedIndexArray
- 通过
self.selectedIndexArray = [[NSMutableArray alloc] init];
初始化
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
中所做的非常残酷,但我相信您将能够根据您的代码进行调整:)