如何重新创建UITableViewController的初始化行为?

时间:2013-05-10 09:24:17

标签: ios objective-c cocoa-touch uiviewcontroller uitableview

我正在创建自己的基类,它将作为UITableViewController替换(让我们称之为IRTableViewController)。因此,我是UIViewController的子类,我希望以与UITableViewController类似的方式使用以下初始化器:

-(id)init;
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
-(id)initWithStyle:(UITableViewStyle)style;

上面的实现如下:

-(id)init
{
    return [self initWithStyle:UITableViewStylePlain];
}


// The designated initializer of the superclass must call the new designated initializer
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    return [self initWithStyle:UITableViewStylePlain];
}


// The designated initializer, must call the superclass designated initializer
- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithNibName:nil bundle:nil];
    if (self)
    {
        self.style = style;
        self.clearsSelectionOnViewWillAppear = YES;
    }
    return self;
}

现在,如果我覆盖-loadView,当我有一个nib文件时,事情会按照需要工作并且我使用其中一个来初始化一个新的子类以下内容:

MyIRTableViewController *vc = [[MyIRTableViewController alloc] init];
MyIRTableViewController *vc = [[MyIRTableViewController alloc] initWithStyle:UITableViewStylePlain];
MyIRTableViewController *vc = [[MyIRTableViewController alloc] initWithNibName:nil bundle:nil];
MyIRTableViewController *vc = [[MyIRTableViewController alloc] initWithNibName:@"MyIRTableViewController" bundle:nil];

当我想使用我的基类而没有一个nib文件时,就出现了问题。在这种情况下,根据我的理解,我需要在UITableView中设置视图属性(以及添加-loadView子视图)。但是,如果我覆盖此方法,这意味着它将在所有情况下运行,即使在使用关联的nib文件初始化对象时也是如此。

有没有办法做我想要的?更糟糕的是,如果我覆盖-loadView,根据文档,我不应该调用[super loadView],那么当我有一个nib文件时,我怎么会忽略那里发生的事情?

PS。我看过Matt Gallagher's related post,但在他的情况下,他打电话给[super loadView],我想避免这种情况。

1 个答案:

答案 0 :(得分:1)

如果您在[super loadView]的情况下拒绝致电nibName != nil,您可以随时使用loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options自行加载笔尖吗?