iOs 5,initWithDecoder在我的自定义init之前被调用
问题描述:
我有一个按钮。当你点击按钮时,它将打开一个新的UITabBarController(在工具箱中预先定义)。iOs 5,initWithDecoder在我的自定义init之前被调用
这是代码:
DealerView *view = [[DealerView alloc] initWithDealerId:976];
[self.navigationController pushViewController:view animated:YES];
正如你可以看到我用我自己的自定义初始化在NSUInteger号到的UITabBarController通过。
现在在我的UITabBarController中,我想分发这个ID号给所有孩子(标签栏中的所有标签)。我这样做与此代码:
- (void)viewDidLoad
{
NSInteger i;
for (i = 0; i < [self.childViewControllers count]; i++){
DealerBaseView *item = (DealerBaseView*) [self.childViewControllers objectAtIndex:i];
item.dealerId = self->dealerId;
}
[super viewDidLoad];
// Do any additional setup after loading the view.
}
这样,每个子视图可以使用这个ID号来获得自己的viewDidLoad方法中正确的数据库信息。
的问题是自我> dealerId始终为0
,所以我说我的代码里面的一些破发点,看看为什么自> dealerId总是返回0(你可以看到它的设置初始化方法)。
- (id) initWithDealerId:(NSUInteger)i{
self = [super init];
if (self){
self->dealerId = i;
}
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
return self;
}
- (id) init{
self = [super init];
return self;
}
- (id) initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
return self;
}
现在事实证明,在这件事的顺序如下:
- 的initWithCoder - 的UITabBarController
- viewDidLoad中 - 的UITabBarController
- viewDidLoad中 - 的UITabBarController的子选项卡
- initWithNibName - UITabBarController
- viewDidLoad - UITabBarController(第二次它击中这个)
- initWithDealerId - 的UITabBarController
所以我的init方法获取此系列最后调用,因此dealerId将始终为0
我的问题很简单。我如何设置dealerId,以便在viewDidLoad被UITabVarController和UITabVarController项(Tab控件中的所有子项)调用时可用?
答
问题似乎是,您以两种不同的方式创建两个不同的DealerView对象,一个来自xib或故事板,另一个来自代码。如果你NSLog的自我价值在不同的初始化方法,我相信你会看到不同的地址,这表明不同的对象。你所看到的单一事件序列确实不是。
初始化问题的答案是只使用一个对象。