添加一个自定义子视图(在xib中创build)到视图控制器的视图 – 我做错了什么

我在xib中创build了一个视图(带有活动指示器,进度视图和标签)。 然后我创build了.h / .m文件:

#import <UIKit/UIKit.h> @interface MyCustomView : UIView { IBOutlet UIActivityIndicatorView *actIndicator; IBOutlet UIProgressView *progressBar; IBOutlet UILabel *statusMsg; } @end #import "MyCustomView.h" @implementation MyCustomView - (id)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { // Initialization code } return self; } - (void)dealloc { [super dealloc]; } @end 

在IB中,我将文件的所有者和查看标识设置为MyCustomView,并将IBOutlet连接到文件的所有者

在MyViewController.m中,我有:

 - (void)viewDidLoad { [super viewDidLoad]; UIView *subView = [[MyCustomView alloc] initWithFrame:myTableView.frame]; [subView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]]; [myTableView addSubview:subView]; [subView release]; } 

当我运行应用程序,视图被添加,但我看不到标签,进度条和活动指标。

我究竟做错了什么?

您需要使用-loadNibNamed方法加载它。 -initWithNibName只适用于UIViewControllers。

将以下代码添加到MyCustomView init方法中:

 NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil]; UIView *mainView = [subviewArray objectAtIndex:0]; [self addSubview:mainView]; 

记住,如果你是从一个nib初始化一个对象,它会调用- (id)initWithCoder:(NSCoder *)aDecoder来初始化,所以如果你要在nib中创buildMyCustomView对象,你必须重写。 如果你只是用initWithFrame:来完成这个工作,那么只需重写它并添加上面的代码即可。 此外,在你的笔尖,确保你有一个顶级UIView,并放置其中的所有其他元素(这确保您的subviewArray只有一个条目)。

这将加载从笔尖的意见,并将其添加到对象,并应该做的伎俩。

我想你需要使用这个方法:

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; 

这是因为你需要在“nibNameOrNil”中传递.xib文件名。

正如hocker所说的,你必须使用传入XIB名字的方法(没有扩展名)。

那么你必须控制这个列表:

  • 在IB中打开.xib文件
  • 点击File Owner并select正确的类(MyCustomView在你的情况下)
  • 按住控制并从文件所有者拖动到视图(现在视图的出口是确定的)

希望它的作品。 干杯。