gpt4 book ai didi

iphone - 重新排序单元格后重新加载自定义 UITableViewCell

转载 作者:行者123 更新时间:2023-12-03 18:36:02 25 4
gpt4 key购买 nike

我有 UITableView,它使用自定义 UITableViewCell。单元格可以具有三种类型的背景图像之一(在每个单元格的 .backgroundView.image 属性中设置):顶部、中间或底部。顶部和底部图像用于第一个和最后一个单元格,并且具有圆角(很像分组的 UITableView 单元格)。 UITableView 中的所有其他“中间”单元格都有一个矩形的中间背景图像。

我的问题是,在 UITableView编辑模式下对单元格重新排序时,单元格不会根据其新位置使用不同的背景图像刷新。例如,如果我将第一个单元格移动到表格的中间,它仍然保留其原始的“顶部”背景图像(带有圆角),并且出现在表格 View 顶部的新单元格仍然具有其原始的“中间”背景图像,看起来有点奇怪。

我可以通过在 TableView 上执行 reloadData 来解决这个问题,但这存在一个问题,即无法提供漂亮优雅的更改动画。我注意到,当重新排序标准分组 UITableView 时,一旦移动/拖动单元格,相关单元格上的背景图像就会发生变化(甚至在移动的单元格被放入新位置之前),这看起来非常好的。我也想实现同样的目标。

为此,我实现了 tableView:targetIndexPathForMoveFromRowAtIndexPath:toProfusedIndexPath ,每次在 TableView 中拖动行时都会调用它。在此范围内,我尝试了设置backgroundView.image的各种方法,包括直接设置图像,然后明确地告诉它使用setNeedsLayout重绘单元格和/或图像,以及setNeedsDisplay 但似乎没有任何东西可以使单元格重绘。我已对这些更改的结果进行了 NSLog 处理,它们似乎正在提交到单元格,因为正确的值出现在 NSLog 中,但单元格似乎没有出现将在屏幕上更新。

如果有人能指出我做错了什么,或者提出更好的方法来实现工作成果,我将非常感激。谢谢!

编辑:以下代码是从赏金中提取并格式化的,以便更容易理解:

UIImage *rowBackground;
UIImage *selectionBackground;
NSInteger sectionRows = [_tableView numberOfRowsInSection:[indexPath section]];
NSInteger row = [indexPath row];
if (row == 0 && row == sectionRows - 1)
{
rowBackground = [UIImage imageNamed:@"field_title_bkg.png"];
selectionBackground = [UIImage imageNamed:@"field_title_bkg.png"];
}
else if (row == 0)
{
rowBackground = [UIImage imageNamed:@"table_row_top_bkg.png"];
selectionBackground = [UIImage imageNamed:@"table_row_top_bkg.png"];
}
else if (row == sectionRows - 1)
{
rowBackground = [UIImage imageNamed:@"table_bottom_row_bkg.png"];
selectionBackground = [UIImage imageNamed:@"table_bottom_row_bkg.png"];
}
else
{
rowBackground = [UIImage imageNamed:@"table_row_bkg.png"];
selectionBackground = [UIImage imageNamed:@"table_row_bkg.png"];
}
UIImageView *rowBackGroundImageView = [[UIImageView alloc] initWithImage:rowBackground];
UIImageView *rowBackGroundSelectionImageView = [[UIImageView alloc] initWithImage:selectionBackground];
if (row != sectionRows - 1)
{
UIImageView *sep = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cell_separator.png"]];
[sep setFrame:CGRectMake(20, 56, 280, 1)];
[rowBackGroundImageView addSubview:sep];
}
[cell setBackgroundView:rowBackGroundImageView];
[rowBackGroundImageView release];

最佳答案

在您的项目中编写以下代码,它应该按预期工作。

- (NSIndexPath *)tableView:(UITableView *)tableView
targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath
toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
NSInteger sectionRows = [tableView numberOfRowsInSection:[sourceIndexPath section]];

UITableViewCell *sourceCell = [tableView cellForRowAtIndexPath:sourceIndexPath];
UITableViewCell *destCell = [tableView cellForRowAtIndexPath:proposedDestinationIndexPath];

if(sourceIndexPath.row == 0 && proposedDestinationIndexPath.row == 1)
{
((UIImageView *)destCell.backgroundView).image = [UIImage imageNamed:@"table_row_top_bkg.png"];

if(proposedDestinationIndexPath.row == sectionRows - 1)
((UIImageView *)sourceCell.backgroundView).image = [UIImage imageNamed:@"table_bottom_row_bkg.png"];
else
((UIImageView *)sourceCell.backgroundView).image = [UIImage imageNamed:@"table_row_bkg.png"];
}

else if(sourceIndexPath.row == sectionRows - 1 && proposedDestinationIndexPath.row == sectionRows - 2)
{
((UIImageView *)destCell.backgroundView).image = [UIImage imageNamed:@"table_bottom_row_bkg.png"];

if(proposedDestinationIndexPath.row == 0)
((UIImageView *)sourceCell.backgroundView).image = [UIImage imageNamed:@"table_row_top_bkg.png"];
else
((UIImageView *)sourceCell.backgroundView).image = [UIImage imageNamed:@"table_row_bkg.png"];
}

else if(proposedDestinationIndexPath.row == 0)
{
((UIImageView *)sourceCell.backgroundView).image = [UIImage imageNamed:@"table_row_top_bkg.png"];

destCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:proposedDestinationIndexPath.section]];
if(sectionRows == 2)
((UIImageView *)destCell.backgroundView).image = [UIImage imageNamed:@"table_bottom_row_bkg.png"];
else
((UIImageView *)destCell.backgroundView).image = [UIImage imageNamed:@"table_row_bkg.png"];
}

else if(proposedDestinationIndexPath.row == sectionRows - 1)
{
((UIImageView *)sourceCell.backgroundView).image = [UIImage imageNamed:@"table_bottom_row_bkg.png"];

destCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:sectionRows - 1 inSection:proposedDestinationIndexPath.section]];
if(sectionRows == 2)
((UIImageView *)destCell.backgroundView).image = [UIImage imageNamed:@"table_row_top_bkg.png"];
else
((UIImageView *)destCell.backgroundView).image = [UIImage imageNamed:@"table_row_bkg.png"];
}

return proposedDestinationIndexPath;
}

关于iphone - 重新排序单元格后重新加载自定义 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com