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

标签 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 文件时,问题就出现了。在这种情况下,据我了解,我需要在 -loadView 中设置 View 属性(以及添加 UITableView subview )。但是,如果我重写此方法,则意味着它将在所有情况下运行,即使是在使用关联的 nib 文件初始化对象时也是如此。

有办法做我想做的事吗?更糟糕的是,如果我重写 -loadView,根据文档,我不应该调用 [super loadView],那么当我有 nib 文件吗?

PS。我见过Matt Gallagher's related post ,但在他的例子中,他调用了[super loadView],我想避免这种情况。

最佳答案

如果您不愿意在 nibName != nil 的情况下调用 [super loadView],您始终可以使用 loadNibNamed:( NSString *)名称所有者:(id)所有者选项:(NSDictionary *)选项 ?

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

相关文章:

ios - 为什么这种自动布局不适用于 iOS 自定义键盘?

objective-c - 在 Swift 协议(protocol)中使用 ObjC block

iphone - 在 for 循环中追加 NSMutable 字符串

cocoa-touch - 如何防止 iOS 应用程序中的数据与 iTunes 同步

ios - UIDatePicker 最小和最大日期不变

具有丰富内容的 iOS 推送通知 - 我可以阻止通知被点击吗?

ios - 是否可以为 adhoc/ota 分发提供视网膜下载图标?

ios - 如何强制 CocoaPods 使用 Github 仓库的最新版本?

iphone - 使用 xmppframework 在 iphone 上进行 facebook 聊天

iphone - 如何以编程方式确定 iPhone 界面方向?