参数化UIView类属性不显示视图

时间:2013-03-31 06:17:23

标签: ios objective-c uiviewcontroller

我正在尝试在viewController类中显示UIView。我在viewController中使用viewDidLoad方法调用initCard方法。第一个功能起作用,但第二个功能不起作用。在函数的第二个版本中,我尝试显示的视图没有显示,但程序的其余部分正常运行。我做错了什么?

来自viewDidLoad

方法调用,有效:

[self initCard];

- (void) initCard {
    [[NSBundle mainBundle] loadNibNamed:@"Card1View_iPhone" owner:self options:nil];
    [self.view addSubview:self.card1ContainerView];
    self.card1ImageView.image = [UIImage imageNamed:@"b1fv.png"];
    CGRect sFrame = CGRectMake(100, 100,
                               self.card1ContainerView.frame.size.width,
                               self.card1ContainerView.frame.size.height);
    self.card1ContainerView.frame = sFrame;
}
来自viewDidLoad

方法调用不起作用:

[self initCard:self.card1ContainerView cardImageView:self.card1ImageView];

- (void) initCard: (UIView*)cardContainerView cardImageView:(UIImageView*)cardImageView {
    [[NSBundle mainBundle] loadNibNamed:@"Card1View_iPhone" owner:self options:nil];
    [self.view addSubview:cardContainerView];
    cardImageView.image = [UIImage imageNamed:@"b1fv.png"];
    CGRect sFrame = CGRectMake(100, 100,
                               cardContainerView.frame.size.width,
                               cardContainerView.frame.size.height);
    cardContainerView.frame = sFrame;
}

1 个答案:

答案 0 :(得分:2)

由于self.card1ContainerView是卡片视图笔尖中连接的IBOutlet,因此在您调用第二个示例时它还没有连接,因为您只在方法本身中加载了笔尖。因此,您将nil作为参数传递给方法。在该方法中加载nib将self.card1ContainerView设置为您可能感兴趣的视图,但此时为时已晚 - 该方法继续使用传递给它的nil值。方法参数按值传递,因此即使您更改调用时传递的指针,该方法也会使用它在调用时复制的值。因此,您要在视图层次结构中添加nil视图,该视图层次结构不执行任何操作。

如果需要参数化容器视图参数,请从方法调用中删除nib加载步骤,然后确保在使用参数self.card1ContainerView调用它之前加载了nib:

- (void)setupCard {
   [[NSBundle mainBundle] loadNibNamed:@"Card1View_iPhone" owner:self options:nil];
   [self setupCard:self.card1ContainerView  imageView:self.card1ImageView];
}

- (void) setupCard: (UIView*)cardContainerView cardImageView:(UIImageView*)cardImageView {
    [self.view addSubview:cardContainerView];
    cardImageView.image = [UIImage imageNamed:@"b1fv.png"];
    CGRect sFrame = CGRectMake(100, 100,
                               cardContainerView.frame.size.width,
                               cardContainerView.frame.size.height);
    cardContainerView.frame = sFrame;
}

我将名称从init...更改为setup...,因为以init开头的方法在大多数Objective-C框架中都有特定的作用。

请注意,必须确保不将nil参数传递给参数化方法,方法是在调用之前加载nib,或者在代码中实例化视图并将其传递给方法。这就是新setupCard方法的作用。