Ios UITableViewCell-设置单元格的最佳位置

Ios UITableViewCell-设置单元格的最佳位置,ios,uitableview,Ios,Uitableview,我一直在UITableViewController中使用自定义单元格,先有一个基本单元格(BaseCell-UITableViewCell的子类),然后是BaseCell的子类(Sub1Cell,Sub2Cell,BaseCell的两个子类) 因为子类共享一些相同的特性,如果我在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 我开始为每

我一直在UITableViewController中使用自定义单元格,先有一个基本单元格(BaseCell-UITableViewCell的子类),然后是BaseCell的子类(Sub1Cell,Sub2Cell,BaseCell的两个子类)

因为子类共享一些相同的特性,如果我在

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
我开始为每个单元格类型重复代码。在实际的自定义UITableViewCell类中放置泛型设置代码是否是一个好地方,也是一种好做法?目前,我编写了一个简单的设置方法:

- (void)setupCell
{
    self.picture.layer.cornerRadius = 5.0f;
    self.picture.layer.masksToBounds = YES;
    self.picture.layer.borderColor = [[UIColor lightGrayColor] CGColor];
    self.picture.layer.borderWidth = 1.0f;
}
我刚在创建手机时打过电话:

Sub1Cell *cell = [tableView dequeueReusableCellWithIdentifier:statusCellIdentifier];
[cell setupCell];
是否有一种方法可以自动调用?我尝试了-(void)prepareforeuse,但显然,它并不是每次都被调用,而且只有当单元格被重用时才会被调用

你有什么建议吗

编辑:

似乎每次我调用
tableView:cellforrowatinexpath
时都会调用它。我对创建自定义单元格的正确方法有点困惑。我是否应该按照以下思路做一些事情:

Sub1Cell *cell = [tableview dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
    cell = [[Sub1Cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    [cell setupCell];
}

如果我对传递的样式不做任何操作,它会影响我的自定义单元格吗?

看起来不错。只要您只在创建单元格时调用它,而不是在每次传递时调用它
tableView:cellforrowatinexpath:
。不确定从示例代码中执行的操作

您可以尝试将代码放入自定义单元格的
drawRect
:以查看发生了什么。请注意,对于自定义单元格,这可能会变得棘手;您可能还需要考虑自定义
layoutSubviews

另外,由于屏幕外渲染的原因,设置这些特定的CALayer属性可能会有一个缓慢的效果,但我认为这对您来说并不是什么大问题,好像应该只在创建单元时进行

更新

我认为您需要将初始设置代码与在表视图操作期间更新单元格内容的代码分开。初始设置代码,在我看来是您上面写的,应该只在创建单元时运行一次。所以我收回我在上面第二段写的东西;不要把它放在
drawRect:

更多

看看苹果的文档。我不确定通过细胞类型的影响。。。如果在重写
initWithStyle:reuseIdentifier:
时将样式传递给super,那么是的,我认为super会使用它来设置单元格的内容视图。如果然后用自己的东西修改内容视图,那么super就是在做白费力气的工作。至于您在“Edit:”下添加的其余代码,我认为看起来不错


值得一提的是,每当我这样做时,我都会使用InterfaceBuilder。

在自定义单元格类中,提供一个初始化方法来初始化。一些代码如下:

- (id)initWithReuseIdentifier:(NSString *)cellIdentifier
{
    if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier])
    {
        self.picture.layer.cornerRadius = 5.0f;
        self.picture.layer.masksToBounds = YES;
        self.picture.layer.borderColor = [[UIColor lightGrayColor] CGColor];
        self.picture.layer.borderWidth = 1.0f;
    }
    return self;
}

您可以在单元格子类中使用
awakeFromNib
。当从故事板中的原型创建新单元时,将调用此函数,但在重复使用单元时不会调用此函数


如果您使用的是原型,那么整个If(cell==nil)问题就会消失,UITableView会在dequeue方法中为您处理所有这些

我在这里看不懂,请将代码添加到您的原始问题中,因为您刚刚意识到无法在答复中正确设置格式。将其添加到问题中。干杯。我最初的方法之一是将设置代码放在“initWithStyle”中,但我无法让它工作。理想情况下,这就是我想说的,因为这似乎是最有意义的。我一直在Interface Builder中布置单元,但为了更改细节,我必须在代码中进行更改,我希望在单元创建过程中这样做。您是使用故事板(动态原型)还是为单元使用单独的xib文件,还是在代码中添加所有内容?带有动态原型的故事板来布置UILabels和UIImageView之类的内容,然后在代码中设置内容和其他设置。这是iOS 5的最佳方法吗?是的,完美。我已经回答了下面的问题。您似乎在void方法中有一个return语句:d这些方法的默认返回类型是id。我将再次尝试这种方法。你知道将UITableViewCellStyleDefault传递给super的init是否会改变单元格的外观吗?@Christopherd RoldField单元格的外观完全由你自己控制。将您想要的任何视图添加到单元格的contentView。在BaseCell类中定义此方法。此解决方案用于编程自定义表格单元格。@WubaoLi:)(blablabla表示注释长度)在本主题中,对于在
-(UITableViewCell*)表格视图:(UITableView*)表格视图cellForRowAtIndexPath:(NSIndexPath*)indexPath
和单元格类之间设置单元格,是否有“最佳实践”?我想我会在单元格的类中设置UI属性,但在
-(UITableViewCell*)tableView:(UITableView*)tableView cellforrowatinexpath:(nsindepath*)indepath中设置实际内容。这听起来是一个很好的方法吗?另一种方法是将一些数据(如NSDictionary)添加到单元格本身,以便它可以用内容填充自己。