iOS - 在多个视图中重用完全相同的单元格设计和代码

时间:2016-12-31 10:39:59

标签: ios objective-c uitableview

我的应用中有4个不同的视图,当前显示完全相同的UITableViewCell。在我的故事板中,我有4次出现相同的单元格(这是一个非常复杂的自定义单元格),在.m文件中,我或多或少都有完全相同的代码将数据关联到UITableViewCell。

我知道这是一种错误的方法 - 维护和更新非常困难。

在故事板中集中UITableViewCell的正确方法是什么,并集中填充表格的代码,以便我可以在不同的视图中重用它?

2 个答案:

答案 0 :(得分:5)

我个人认为在代码中编写所有视图是达到最大可重用性(和可扩展性,因为nib文件不能被子类化)的最佳方法。但我认为您也可以为UITableViewCell创建一个单独的nib并将其加载到每个视图控制器中。我认为无论采用哪种方法(在代码中完全设计单元格,或借助nib文件),您都可以使用以下内容在viewDidLoad中的代码中加载单元格:

[self.tableView registerClass:MyCustomCell.class forCellReuseIdentifier:@"Cell"];

以上是我最常用的,因为我喜欢在代码中编写所有视图,显然对于加载nib,你可以参考dirtydanee描述的方法。 < / em>的

然后,您的tableView将在-cellForRowAtIndexPath:

中加载具有相同标识符的单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    // configure your cell here ...

    return cell;
}

答案 1 :(得分:4)

我建议为Xib子类创建一个UITableViewCell文件,并在其上声明configuration(_:)函数。此函数可以使用任何参数,例如字典。但是,您可以提供包含参数的特定数据模型,可能是struct或您正在使用的任何数据类型。

ReusableTableViewCell.h

#import <UIKit/UIKit.h>

@interface ReusableTableViewCell: UITableViewCell 
@property(nonatomic, weak) IBOutlet UILabel* title;
@property(nonatomic, weak) IBOutlet UILabel* subTitle;

/// - Parameter configuration: It is a dictionary at the minute
///                            However, it could be any type, you could even be creating your own model struct or class
- (void)configureWith:(NSDictionary *)configuration;
@end

ReusableTableViewCell.m

#import "ReusableTableViewCell.h"

@implementation ReusableTableViewCell

- (void)configureWith:(NSDictionary *)configuration {
    self.title.text = configuration[@"title"];
    self.subTitle.text = configuration[@"subTitle"];
}

- (void)prepareForReuse {
    [super prepareForReuse];
    self.title.text = nil;
    self.subTitle.text = nil;
}

@end

nib注册到tableView。重要的是,请勿将其注册为class,请将其注册为nib

[tableView registerNib: [UINib nibWithNibName:@"yourCellNibName" bundle:nil] forCellReuseIdentifier:@"yourReuseIdentifier"];

cellForRowAtIndexPath的最后,只需获取配置并将其提供给tableViewCell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // create your cell
    ReusableTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"yourReuseIdentifier"];
    // get your configuration
    NSDictionary *configuration = [configurations objectAtIndex:indexPath.row];

    //configure your cell
    [cell configureWith: configuration];
    return cell;
}