Добавление пользовательского подпредставления (созданного в 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 в вашем случае)
- Удерживая нажатой кнопку управления, перетащите из "Владелец файла" в представление (теперь выход для представления в порядке)
Надеюсь, что это работает. Приветствия.