在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...]'
我做错了什么?
答案 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方法。
将这些代码放在您创建自定义的位置。