我正在尝试在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;
}
答案 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
方法的作用。