UIView addSubview 方法添加的子视图没有显示出来

7
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    HeadViewController *headViewController = [[HeadViewController alloc] initWithNibName:@"HeadViewController" bundle:nil];    
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 120)];
    [view addSubview:headViewController.vew];
    [self.view addSubview:view];
}

HeadViewController.h:

@interface HeadViewController : UIViewController
{
    IBOutlet UIView *view;
}
@property (nonatomic, retain)IBOutlet UIView *view;
@end

我将视图连接到文件的所有者。

但我看不到 headViewController.view

3个回答

15

首先,您不需要在HeadViewController类中定义view出口。它会自动从UIViewController超类继承。

然后,我建议您直接将HeadViewController的视图添加到当前视图中。例如:

- (void)viewDidLoad
{
     [super viewDidLoad];
     // Do any additional setup after loading the view from its nib.
     HeadViewController *headViewController = [[HeadViewController alloc] initWithNibName:@"HeadViewController" bundle:nil];    
     headViewController.view.frame = CGRectMake(0, 0, 320, 120);
     [self.view addSubview:headViewController.view];
}

但是,如果您正在使用ARC(自动引用计数),headViewController实例很可能在viewDidLoad方法结束后被释放。在当前显示的控制器中将该实例赋值给一个局部变量是方便的(我会说这是强制性的)。这样,如果需要,您将能够稍后处理其视图组件,该实例将被保留,并且其他所有内容将完美运行。您应该拥有类似以下代码:

- (void)viewDidLoad
{
     [super viewDidLoad];
     // Do any additional setup after loading the view from its nib.
     self.headViewController = [[HeadViewController alloc] initWithNibName:@"HeadViewController" bundle:nil];    
     headViewController.view.frame = CGRectMake(0, 0, 320, 120);
     [self.view addSubview:headViewController.view];
}
并且
@interface MyController ()
    @property (nonatomic, strong) HeadViewController *headViewController;
@end

.m 类实现文件开头的隐藏接口定义中。


我纠正你一下:如果headViewController.view没有作为subview添加进来,它的值就是nil。需要交换addSubview和设置frame的顺序。 - NeverBe
文件的所有者对象在NIB文件中是否定义为“HeadViewController”对象?并且您是否检查了插座连接?如果一切都正确配置,它必须正常工作。否则,很抱歉我不知道如何帮助您。 “headViewController”值是非nil值吗? - marzapower
你使用的 NIB 名称可能有问题? - marzapower
我已经尝试了你刚才告诉我的每一种方法,但都没有奏效。然后我创建了另一个ViewController,现在它可以正常工作了...我只是想知道为什么?谢谢。祝你有愉快的一天! - jxdwinter
我刚刚遇到了这个问题,忘记使用loadNibNamed而不是alloc/init,但这只适用于UIView,而不是带有nib的控制器类。 - Stephen J
显示剩余2条评论

0

看起来像是打错字了 - 在 .view 中忘记了 i

[view addSubview:headViewController.vew];


1
这可能是正确的,但看起来操作员很久以前就解决了这个问题... - greedybuddha

0

语法中缺少 i

[view addSubview:headViewController.view];


答案是两年前提供的。现在的目的是什么? - YoungHobbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接