我正在创建自己的基类,该基类将充当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中设置view属性(以及添加-loadView子视图)。但是,如果我重写此方法,则意味着即使在使用关联的nib文件初始化对象时,它也将在所有情况下运行。

有什么方法可以做我想要的吗?更糟糕的是,根据文档,如果我覆盖-loadView,我不应该调用[super loadView],那么当我拥有一个nib文件时,我将如何忽略那里发生的一切?

PS。我见过Matt Gallagher's related post,但是在他的情况下,他叫[super loadView],我想避免这种情况。

最佳答案

如果在[super loadView]的情况下不想调用nibName != nil,则始终可以使用loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options自己加载笔尖?

关于ios - 如何重新创建UITableViewController的初始化行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16479022/

10-11 19:48