如何从xib加载自定义单元格,但保持在单元格内的出口而不是ViewController?

时间:2013-08-26 07:56:26

标签: ios objective-c

直到现在,我正在做这样的事情:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
     if (self) {
        // Initialization code

        NSArray *nibsArray = [[NSBundle mainBundle] loadNibNamed:@"BOAFormCell" owner:self options:nil];
        self = nibsArray[0];
        self.selectionStyle = UITableViewCellSelectionStyleNone;
        self.valueTextLabel.numberOfLines = 2;
    }
    return self;
}

这显然会导致内存泄漏。

如果我将加载代码放在cellForRowAtIndexPath中,那么它将使ViewController成为xib的所有者。它将在VC中寻找出口。

我已经在很多ViewControllers中重用了这个单元格。

我想避免这种泄漏,但我不希望所有这些VC成为xib的个人所有者并在那里实现IBActions并在其中拥有Outlets的属性。

我应该创建一个静态方法,只是从xib加载单元并将它返回给我吗? 但是,我将如何将对象作为xib的所有者?

3 个答案:

答案 0 :(得分:0)

您必须创建.xib文件,然后创建一个继承自{。{1}}且与.xib同名的类。

在.xib中,您可以根据需要设计单元格。没有ViewController,只是一个UIViewCell及其出口。

选择您的单元格,在“工具”/“检查器”中,将单元格的类别设置为自定义单元格的名称。

enter image description here

现在,如果您使用“助理编辑器”,则可以将插座拖放到.h文件中,以便为自定义单元格添加属性。

在项目的任何类别中,如果您导入全新单元格的标题,您将能够通过调用来创建自定义单元格:

UITableViewCell

(在这种情况下,我的文件命名为:CustomCell.h / CustomCell.m / CustomCell.xib)

为此自定义单元格创建的属性可以像任何类的任何属性一样访问。

答案 1 :(得分:0)

在您的Tableview中,您可以添加此代码以运行您的customcell我希望这对您有用

 - (UITableViewCell *)tableView:(UITableView *)tableView
            cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    {
        CustomCell *cell =
            [tableView dequeueReusableCellWithIdentifier:@"Cell"
                                            forIndexPath:indexPath];
        if (cell == nil) 
    {
      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    UITableViewCell *cell = [nib objectAtIndex:0];

    }
cell.textLabel.text = @"Hi";

return cell;
    }

答案 2 :(得分:0)

对于iOS 6+,您应该使用此方法:

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

在加载单元格之前调用它。

还有其他类似的方法,您还可以在页面中注册页眉,甚至可以通过编程方式将表格注册到tableview中。

    - (void) viewDidLoad {

        ...
        [self.tableView registerNib:[UINib nibWithNibName:@"CellId" bundle:nil] forCellReuseIdentifier:cellIdentifier];
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView
                cellForRowAtIndexPath:(NSIndexPath *)indexPath 
        {
            CustomCell *cell =
                [tableView dequeueReusableCellWithIdentifier:@"CellId"
                                                forIndexPath:indexPath];
      }

dequeueReusableCellWithIdentifier将始终返回一个单元格,因此无需检查cell == nil