Добавление настраиваемого 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 (теперь выход для представления в порядке)
Надеюсь, что это сработает. Приветствия.