Добавление пользовательского подпредставления (созданного в xib) в представление контроллера представления - Что я делаю неправильно - PullRequest
61 голосов
/ 18 марта 2011

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

131 голосов
/ 18 марта 2011

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

Добавьте следующий код в метод инициализации 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 имеет только одну запись).

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

1 голос
/ 18 марта 2011

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

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

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

0 голосов
/ 18 марта 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...