2010-11-17 7 views
2

После того, как я просмотрел документы, я решил использовать следующую технику, используя «viewWithTag», чтобы извлечь подвыборы из основного корневого представления, возвращаемого loadNibNamed: owner: options: для начала я немного смутился, поскольку предположил loadNibNamed: owner: options вернет массив, содержащий все мои элементы пользовательского интерфейса (например, метки, кнопки и т. д.), когда на самом деле он возвращает корневой вид (или корневые представления). Может кто-нибудь подтвердить, что я делаю это правильно, мне просто интересно, есть ли другие (возможно, лучшие) способы извлечения и установки элементов из xib-файла?Извлечение элементов пользовательского интерфейса из xib?

- (void)loadView { 
    NSLog(@"HYBRID UI: %s", __PRETTY_FUNCTION__); 
    NSArray *nibArchive = [[NSBundle mainBundle] loadNibNamed:@"Interface" owner:self options:nil]; 
    NSLog(@"SIZE: %d ARRAY: %@", [nibArchive count], nibArchive); 

    // UIView 
    UIView *nibView = [nibArchive lastObject]; 
    [nibView setFrame:[[UIScreen mainScreen] applicationFrame]]; 
    NSLog(@"FRAME: %@", NSStringFromCGRect([nibView frame])); 
    [self setView: nibView]; 

    // UILabel 
    UILabel *nibLabel = (UILabel *)[nibView viewWithTag:101]; 
    [nibLabel setText:@"FRINGE"]; 
    [nibLabel setTextColor:[UIColor whiteColor]]; 

    // UIImageView 
    UIImageView *nibImageView = (UIImageView *)[nibView viewWithTag:102]; 
    [nibImageView setBackgroundColor:[UIColor whiteColor]]; 
} 

веселит Гэри

ответ

3

loadNibNamed:owner:options: действительно возвращает массив всех корень объектов в NIB. Чтобы добраться до других объектов в иерархии, вы можете перемещаться по иерархии вручную (в большинстве случаев это не очень хорошая идея), использовать теги так же, как вы, или использовать розетки.

Если вы объявляете розетки в своем контроллере вида для просмотра, метки и изображения и соединяете их в NIB с соответствующими объектами, они будут автоматически подключены к loadNibNamed:owner:options:.

PS: Почему вы загружаете NIB вручную в любом случае? Не можете ли вы запустить свой контроллер вида с initWithNibName:bundle и выполнить оставшуюся инициализацию в viewDidLoad?

+0

Привет, Оле, я просто делал небольшое исследование вокруг предмета. Первоначально я не использовал xib, и все представления были настроены с использованием кода. Затем я начал смотреть на половину дома с помощью xib и подключить его к iVars через IBAction. В приведенном выше примере я просто играл, чтобы посмотреть, как я могу получить доступ к элементам в xib без использования IBAction или подключения к нему вручную изнутри IB. – fuzzygoat

+0

Точно, что я был после «Чтобы перейти к другим объектам в иерархии, вы можете перемещаться по иерархии вручную (в большинстве случаев это не очень хорошая идея), использовать теги так же, как вы, или использовать розетки». очень признателен. – fuzzygoat

2

Похоже, что вы делаете это тяжелее, чем это должно быть. Если вы подклассифицируете UIViewController, просто позвоните [super initWithNibName:@"whatever" bundle:nil] в ваш init, тогда вам не нужно будет звонить loadNibNamed:owner:options. И так как вы используете наконечник, вы должны поместить свой код в viewDidLoad без реализации loadView.

В интерфейсе, настроить IBOutlet взглядов вы заинтересованы в:

@property (nonatomic, retain) IBOutlet UILabel *titleLabel; 

В бобах, установить владельца класса в файле на вашем UIViewController подкласса, а затем вы можете подключить titleLabel к фактический UILabel.

Смежные вопросы