Добавление настраиваемого subview (созданного в xib) в представление контроллера представления - что я делаю неправильно

Я создал представление в 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];
}

Когда я запускаю приложение, представление добавляется, но я не вижу метку, индикатор выполнения и индикатор активности.

Что я делаю неправильно?

Ответ 1

Вам нужно загрузить его с помощью метода -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 для инициализации, поэтому вам придется переопределить это, если вы создаете объект MyCustomView в nib. Если вы просто делаете это с помощью initWithFrame:, просто переопределите это и добавьте код выше. Кроме того, в своем наконечнике убедитесь, что у вас есть один UIView верхнего уровня, и поместите в него все другие элементы (что гарантирует, что ваш subviewArray имеет только одну запись).

Это загрузит представления из nib и добавит их к объекту и будет делать трюк.

Ответ 2

Я думаю, вам нужно использовать этот метод:

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

Это потому, что вам нужно передать имя файла .xib в "nibNameOrNil".

Ответ 3

Как сказал hocker, вы должны использовать этот метод, передающий имя XIB (без расширения).

Затем вам нужно управлять этим списком:

  • Откройте файл .xib в IB
  • Нажмите "Владелец файла" и выберите правильный класс (MyCustomView в вашем случае).
  • Удерживайте нажатой кнопку управления и перетащите ее из File Owner в View (теперь выход для представления в порядке)

Надеюсь, что это сработает. Приветствия.