62

我在 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];
}

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

我究竟做错了什么?

4

3 回答 3

131

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

将以下代码添加到您的 MyCustomView 初始化方法中:

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:,那么只需覆盖它并添加上面的代码。此外,在您的 nib 中,确保您有一个顶级 UIView,并将所有其他元素放在其中(确保您的 subviewArray 只有一个条目)。

这将从笔尖加载视图并将它们添加到对象中,并且应该可以解决问题。

于 2011-03-18T20:46:26.583 回答
1

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

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

这是因为您需要将“nibNameOrNil”中的 .xib 文件名传递给它。

于 2011-03-18T16:09:04.873 回答
0

正如 hocker 所说,您必须使用传递 XIB 名称(不带扩展名)的方法。

然后你必须控制这个列表:

  • 在 IB 中打开 .xib 文件
  • 单击文件所有者并选择正确的类(在您的情况下为 MyCustomView)
  • 按住控制并从文件所有者拖动到视图(现在视图的出口就可以了)

希望它有效。干杯。

于 2011-03-18T20:26:26.873 回答