Добавление пользовательского подпредставления (созданного в 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];
}

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

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

3 ответа

Решение

Вам нужно загрузить его, используя -loadNibNamed метод. -initWithNibName только для UIViewControllers.

Добавьте следующий код в метод инициализации MyCustomView:

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

Помните, что если вы инициализируете объект из пера, он вызывает - (id)initWithCoder:(NSCoder *)aDecoder для инициализации, поэтому вам придется переопределить это, если вы создаете объект MyCustomView внутри пера. Если вы просто делаете это с initWithFrame:, затем просто переопределите это и добавьте код выше. Кроме того, в своем кончике убедитесь, что у вас есть один UIView верхнего уровня, и поместите все остальные элементы в него (это гарантирует, что ваш subviewArray имеет только одну запись).

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

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

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

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

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

Тогда вы должны контролировать этот список:

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

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

Другие вопросы по тегам