[ios]参数化 UIView 的类属性不显示视图

发布时间: 2017/3/21 23:09:39
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想在我的 viewController 类中显示 UIView。我调用 initCard 方法从我 viewDidLoad 我的 viewController 方法。第一个函数工作,但是第二次却没有。在该函数的第二个版本我试图显示的视图不存在,但剩下的程序功能正常。我到底做错了?

从方法调用 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:

因为 self.card1ContainerViewIBOutlet 连接在卡片视图 nib,当时你象你只能加载方法本身在nib称尚未连接,第二个示例。因此您传递 nil 作为该方法的参数。在这方法设置加载nib self.card1ContainerView 要认为你可能感兴趣的但在那时就太晚了-该方法将继续使用在传递给它的零值。方法参数是通过值传递的所以即使您更改时调用,方法使用它复制当时的价值传递指针,它被称为。所以你要添加 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 参数化方法,通过加载家发钞银行之前调用或实例化视图中的代码并将它们传递给该方法的参数。这是什么新 setupCard 方法。

赞助商