如何初始化UITableView?来自XIB还是以编程方式?

时间:2009-12-02 00:33:40

标签: ios objective-c iphone uitableview interface-builder

我有一个简单的请求,我花了很多时间(令人尴尬)..

我已经对UITableView进行了细分,以添加一些功能。这些新功能需要像NSMutableSet这样需要分配/初始化的东西。

我已将对象的初始化例程放在

- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {

我从苹果文档中理解为正确 - 但这不会被调用(通过对代码的断点来确定)。

我正在使用IB,并将UITableView拖到视图上,并将其类更改为我的新子类。没有UITableViewController。 我也尝试过:

- (void)loadView {
- (id)init {
- (id)initWithFrame:(CGRect)frame {

没有成功。我希望这个课程既可以使用IB,也可以在将来以编程方式工作。除了初始化的位置之外,一切都有效。

2 个答案:

答案 0 :(得分:6)

当对象从XIB文件加载时,它们会得到-(id)initWithCoder:(NSCoder*)coder

如果您以编程方式从XIB创建对象,则需要同时实现指定的初始化程序-initWithFrame:style: -initWithCoder:,并在每个初始化程序中执行所有初始化内容。

保持这两者同步可能会很麻烦,因此大多数人都喜欢将初始化内容分解为私有方法,通常称为-commonInit

您可以在某些Apple示例代码中看到此示例:HeadsUpUI

- (void)commonInit
{
    self.userInteractionEnabled = YES;
}

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        [self commonInit];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder])
    {
        [self commonInit];
    }
    return self;
}

答案 1 :(得分:1)

当人们对Cocoa或Cocoa Touch不熟悉时,人们常犯的一个错误就是在他们实际上不需要的时候进行子类化。我已经看过许多自定义窗口,tableviews,scrollview和imageview的例子,这些例子从未被编写过。

您在UITableView中添加了哪些功能?您确定通过委托方法或使用自定义单元格类无法完成您想要做的事情吗?