将自定义子视图(在xib中创建)添加到视图控制器的视图中 - 我做错了什么

时间:2011-03-18 16:02:32

标签: objective-c ios xib addsubview

我在xib中创建了一个视图(带有活动指示器,进度视图和标签)。 然后我创建了.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];
}

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

我做错了什么?

3 个答案:

答案 0 :(得分:131)

您需要使用-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中创建MyCustomView对象,则必须覆盖它。如果你只是使用initWithFrame:,那么只需覆盖它并添加上面的代码。此外,在您的笔尖中,确保您有一个顶级UIView,并将所有其他元素放在其中(这样可确保您的subviewArray只有一个条目)。

这将从笔尖加载视图并将它们添加到对象中,并应该这样做。

答案 1 :(得分:1)

我认为您需要使用此方法:

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

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

答案 2 :(得分:0)

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

然后你必须控制这个清单:

  • 在IB
  • 中打开.xib文件
  • 单击文件所有者,然后选择正确的类(在您的情况下为MyCustomView)
  • 按住控件并从文件所有者拖动到视图(现在视图的插座正常)

希望它有效。欢呼声。

相关问题