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

Def*_*Day 0 iphone objective-c interface-builder uitableview ios

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

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

我把对象的初始化例程放在了

- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
Run Code Online (Sandbox Code Playgroud)

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

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

- (void)loadView {
- (id)init {
- (id)initWithFrame:(CGRect)frame {
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ott 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;
}
Run Code Online (Sandbox Code Playgroud)