Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以使用reuseIdentifier拥有具有不同内容的自定义TableViewCell?_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 是否可以使用reuseIdentifier拥有具有不同内容的自定义TableViewCell?

Ios 是否可以使用reuseIdentifier拥有具有不同内容的自定义TableViewCell?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个TableView,其中包含多达50个单元格,其中包含5个子视图,其中包含常见信息(标题、说明、价格…)和5个可选子视图(报价、报价到期…)。通过添加所有内容,然后隐藏不适合该单元格的可选视图来构建这些视图 使用通用的reuseIdentifier意味着所有单元的布局都与上一个构建和缓存的单元相同。因此,最初我使用的是reuseIdentifier:nil,它可以工作,但每次显示它们时重新构建它们似乎会对性能造成不良影响。一些可以跨单元重用,因为有一个解决方案是对每个单元变体使用单独的U

我有一个TableView,其中包含多达50个单元格,其中包含5个子视图,其中包含常见信息(标题、说明、价格…)和5个可选子视图(报价、报价到期…)。通过添加所有内容,然后隐藏不适合该单元格的可选视图来构建这些视图


使用通用的
reuseIdentifier
意味着所有单元的布局都与上一个构建和缓存的单元相同。因此,最初我使用的是
reuseIdentifier:nil
,它可以工作,但每次显示它们时重新构建它们似乎会对性能造成不良影响。一些可以跨单元重用,因为有一个解决方案是对每个单元变体使用单独的
UITableViewCell
类和
可重用标识符。但它会导致更多的代码,并且在需要时管理和更改会变得混乱

第二种解决方案是使用单个
UITableViewCell
子类和单个
可重用标识符

现在,您需要区分此create
enum
for
TableViewCellType
的单元格类型

typedef NS_ENUM(NSInteger, TableCellType) {
    TableCellTypeOfferPrice,
    TableCellTypeExpiry,
    TableCellTypeXYZ
};
UITableViewCell
子类中添加属性

@property (nonatomic, assign) TableCellType cellType;
UITableViewCell
子类中创建一个方法

@property (nonatomic, assign) TableCellType cellType;
-(void)setupUIWithCellType:(TableCellType)cellType

在这种方法中,您可以使用
切换案例
根据单元格类型设置UI元素。您可以在此处隐藏不必要的视图,调整子视图的框架等

现在在DataSource方法
cellforrowatinexpath
中,这样做

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
        //Call to setupUIWithCellType
        [cell setupUIWithCellType:dataArray[indexpath.row]];
        return cell;
}

这种方法使控制器类更干净,所有必要的代码都以良好的方式存在于TableViewCell子类中。

在单元格的类实现中实现
prepareforeuse
。将视图重置为其默认状态。在
tableView:cellForRowAtIndexPath:
中,根据需要为要显示的特定数据配置单元格。

您可以为5个变体创建5种不同类型的单元格,并可以使用不同的可重用标识缓存和维护它们。但这会导致编写更多的代码,最终您将拥有更多的视图和类。在单元格的类实现中实现
prepareforeuse
。如果您的单元格没有
UITableVewCell
子类,那么现在您将:)@Avi-读到这篇文章时,它用于将单元格“重置”为调用initWithStyle时的状态,但开销较小,这意味着我可以使用静态reuseIdentifier?我将进一步探索,但将等待关于如何使用“每个单元一个重用标识符”方法的答案。@IrfanGul-是的,它会变得混乱,我认为这是我最不喜欢的选择。也许我需要为未来的约会买单,但我现在需要选择一个低挂果实,让这个应用程序工作起来。检查第二种方法,我会更频繁地这么做。:)我有一个BookTableCell和另一个InfoTableCell,两者之间的分离使用了与您上面描述的类似的方法。对于BookTableCells,我们可能会有一些变体,如“带有子视图A的公共子视图”、“带有子视图B的公共子视图”、“带有A和B的公共子视图”、“带有C的公共子视图”、“带有A和C的公共子视图”“等等。。。有5个可选子视图,虽然不太可能每个变体都有一个,但我可以看到我们的子视图>10。这不是我想处理的事情,@Avi建议的方法是有效的,显然是缓存但不破坏布局,所以这看起来是目前对我来说最可行的解决方案。尽管仍然不确定如何在每行的reuseIdentifier发生更改的情况下执行此操作,也不确定哪一行会提供更好的性能。如果每行的reuseIdentifier发生更改,则不会在测试中真正重用:),我在使用reuseIdentifier:nil时记录了单元格的对象引用,当单元格从屏幕上滚下,然后滚回视图时,该单元格似乎有一个新的对象引用。这向我暗示,当一个现有对象可能已经被设置为indexPath.row的reuseIdentifier出列时,它们正在被重建。我可能弄错了,或者完全错了,因为这对我来说是全新的。每行有一个可重复使用的单元格在技术上是重复使用单元格,但这绝对不是我的本意。大多数表视图使用非常小的单元格类型选择(通常为1),但在用户滚动时使用了许多单元格类型。我可以看出,我可能会混淆单元格对象引用中的更改,因为没有重用出列的、样式化的单元格。无论如何,谢谢你的解释,我想我已经完成了,因为它工作得很好,我还有很多事情要解决:)