1

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

方法调用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;
}
4

1 回答 1

2

因为self.card1ContainerViewIBOutlet卡片视图笔尖中的一个已连接,所以在您调用第二个示例时它尚未连接,因为您仅在方法本身中加载笔尖。因此,您将nil作为参数传递给该方法。在该方法中加载 nib 设置self.card1ContainerView为您可能感兴趣的视图,但此时为时已晚 - 该方法继续使用传递给它的 nil 值。方法参数是按值传递的,因此即使您更改调用时传递的指针,该方法仍使用它在调用时复制的值。因此,您正在将nil视图添加到视图层次结构中,但它什么也不做。

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

- (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方法的作用。

于 2013-03-31T07:07:52.290 回答