0

我有一个按钮。当您单击按钮时,它将打开一个新的 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 方法中获取正确的数据库信息。

问题是 self->dealerId 始终为 0。

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

所以我的 init 方法在这个系列中最后被调用,因此dealerId 将始终为 0。

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

4

1 回答 1

0

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

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

于 2012-07-11T15:50:46.097 回答