iOs 5,initWithDecoder在我的自定义init之前被调用

时间:2012-07-11 11:40:55

标签: ios ios5 uitabbarcontroller initialization uitabbar

我有一个按钮。当您单击该按钮时,它将打开一个新的UITabBarController(在工具箱中预定义)。

这是代码:

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方法中获取正确的数据库信息。

问题是自我&gt; dealerId始终为0.

所以我在代码中添加了一些断点,看看为什么self-&gt; 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;
}

现在事实证明,事情的顺序如下:

  1. initWithCoder - UITabBarController
  2. viewDidLoad - UITabBarController
  3. viewDidLoad - UITabBarController的子选项卡
  4. initWithNibName - UITabBarController
  5. viewDidLoad - UITabBarController(第二次点击它)
  6. initWithDealerId - UITabBarController
  7. 所以我的init方法最后在这个系列中被调用,因此dealerId将始终为0.

    我的问题很简单。我如何设置dealerId,以便在为UITabVarController和UITabVarController项(选项卡控制器内的所有子项)调用viewDidLoad时它是可用的?

1 个答案:

答案 0 :(得分:0)

问题似乎在于您以两种不同的方式创建两个不同的DealerView对象,一个来自xib或故事板,另一个来自代码。如果你在不同的init方法中使用NS记录self的值,我相信你会看到不同的地址,它们表示不同的对象。你所看到的单一事件序列实际上并非如此。

初始化问题的答案是仅使用一个对象。