我想创建一个 UINavigationController 的子类,它总是以相同的根控制器开始。没什么特别的,所以(对我来说)像这样重写 init 方法是非常有意义的:
- (id) init {
rootController = [[MyController alloc] init];
if (self = [super initWithRootViewController:rootController]) {
// do some more initialization
}
return self;
}
这显然会产生问题,因为[super initWithRootViewController]会调用[UINavigationController init],这当然是我们重写的init方法,所以会发生无限递归。
我不想创建具有不同名称的 init 方法,例如“initCustom”。
目前我只能想出一个解决方案,但我真的很讨厌这种 hack:
- (id) init {
if (initCalled)
return self;
initCalled = YES;
rootController = [[MyController alloc] init];
if (self = [super initWithRootViewController:rootController]) {
// do some more initialization
}
return self;
}
所以我的问题是:有没有更好的方法来处理这个问题?我确定我遗漏了一些非常明显的东西,但我没有看到。
编辑:我想这样做的原因,可以在下面我的评论之一中看出:
我想创建一个始终以特定视图控制器开头的导航控制器。我想对班级的消费者隐藏这一点。不需要暴露的东西就不用暴露了。让生活更轻松,代码更简洁(发明封装的原因之一,对吧?)