ios - 参数化 UIView 类属性不显示 View

标签 ios objective-c uiviewcontroller

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

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;
}

最佳答案

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

如果您需要参数化容器 View 参数,请从方法调用中删除 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 还是通过在代码中实例化 View 并将它们传递给方法。这就是新的 setupCard 方法的作用。

关于ios - 参数化 UIView 类属性不显示 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15726935/

相关文章:

ios - 拉动刷新不执行刷新功能?

ios - Xcode 5.1.1 - 项目无法在 iOS 模拟器中运行(黑屏)

iphone - 在 iPhone 上创建目录

ios - 什么是操作系统状态?

objective-c - 用于 Google 文档的 iOS Objective-C 包装器

uiviewcontroller - MonoTouch 的 ViewDidUnload 和 ShouldAutorotateToInterfaceOrientation 替换

ios - 用新的 UIView 替换 self.view 显示黑色 View

javascript - 安卓/IOS 浏览器。防止默认键盘显示在字段焦点上 (Javascript)

带有 Objective C 示例的 iOS 模式,用于防止对方法的并发调用

ios - 如何将所有坐标放入 map 的边界? fitBounds 等效?