当我初始化自定义单元格时,它没有设置为'[(super或self)init ...]'的结果时返回'self'

时间:2012-01-18 11:15:36

标签: iphone ios xcode uitableview init

在CustomCell.m中,我定义了init方法,我想从IB加载单元格:

- (id)init {
    self = [super init];
    if (self) {
        NSArray *nib =[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        self = [nib objectAtIndex:0];

    }
    return self;
}

在方法cellForRowAtIndexPath的MyTableViewController.m中我初始化我的自定义单元格

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

cell=[[CustomCell alloc]init];
return cell;

}

一切都按照我的预期运作,但当我做Product -> Analyse时,我得到了 Returning 'self' while it is not set to the result of '[(super or self) init...]'
我做错了什么?

4 个答案:

答案 0 :(得分:8)

您正在使用从数组返回的对象覆盖self(从super init返回)。如果要从nib加载自定义单元格,请在cellForRowAtIndexPath方法中执行此操作,或者在从nib加载的自定义单元格上创建一个便捷类方法:

在你的cellForRowAtIndexPath中:

cell = [CustomCell cell];

在你的手机实施中:

+(CustomCell*)cell
{
    NSArray *nib =[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];         
    return [nib objectAtIndex:0];
}

编辑 - 更改了方法名称,因为new *表示将返回保留的对象。

答案 1 :(得分:7)

保持您的init方法如下,并在Interface Builder

中进行链接
- (id)init {
    self = [super init];
    if (self) {

    }
    return self;
}

并且

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";

    CustomCell *cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];

        for (id currentObject in topLevelObjects){
            if ([currentObject isKindOfClass:[UITableViewCell class]]){
                cell =  (CustomCell *) currentObject;
                break;
            }
        }
    }
}

答案 2 :(得分:1)

我正在做的是

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) 
    {
        // Initialization code.
        //
        UITableViewCell *view = [[[NSBundle mainBundle] loadNibNamed:@"SmallCellView" owner:self options:nil] lastObject];
        self.backgroundView = view;
}
    return self;
}

然后在主类

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    SmallCellView *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[SmallCellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
 }
  return cell;
}

对我来说这很好,Product -> Analyse没有发出任何警告或错误

答案 3 :(得分:1)

我遇到了同样的问题,我通过删除类似

的代码修复了它
NSArray *nib =[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];         
return [nib objectAtIndex:0];

来自CustomView的定义init方法。

将这些代码放在您创建自定义的位置。