Подтвердить что ты не робот

ViewDidLoad для UIView?

Что такое viewDidLoad для UIView?

У меня есть UIView с xib. Я хотел бы скрыть одно из них в режиме просмотра, когда оно загружено. Я попытался использовать это.

- (id)initWithCoder:(NSCoder *)aDecoder{
    ....
    _theView.hidden = YES;
}

Но subview _theView на данный момент равно nil.

Этот ответ не помог мне, потому что в момент создания UIViewController UIView еще не создан. Он создается программно, позже.

4b9b3361

Ответ 1

AwakeFromNib вызывается только в том случае, если представление загружено из файла nib. layoutSubviews вызывается для всех представлений, вы можете добавить bool _loaded = yes; в функцию layoutSubviews и узнать, загружено ли представление.

Ответ 2

Try

-awakeFromNib метод

Или в xib установите свойство view, скрытое для вашего subview

Ответ 3

Принятый ответ вводит в заблуждение. awakeFromNib всегда будет вызываться, а не только при использовании ниба. Из документов Apple:

awakeFromNib:

Подготавливает приемник для обслуживания после его загрузки с Архиватор интерфейса Builder, или файл nib.

Ссылка

В следующем примере я использовал только storyBoard Вы можете проверить это очень легко.

Это наш ViewController:

enter image description here

ViewController.m:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
}

-(void)awakeFromNib
{
    NSLog(@"awakeFromNib in view controller");
}

@end

RedView.m:

#import "RedView.h"

@implementation RedView

-(void)awakeFromNib
{
        NSLog(@"awakeFromNib inside RedView");
        self.green.hidden = YES;
}

@end

Порядок печати:

  • awakeFromNib в поле зрения контроллера
  • awakeFromNib внутри RedView
  • viewDidLoad

И, конечно же, зеленый вид будет скрыт.


Edit:

awakeFromNib не будет вызываться, если вы используете только код для создания своего вида, но вы можете называть его самостоятельно или еще лучше, создайте свой собственный метод.

Пример без StoryBoard (только код):

RedView.m:

#import "RedView.h"

@implementation RedView

-(void)loadRedView
{
    NSLog(@"loadRedView");
    self.green = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    self.green.backgroundColor = [UIColor greenColor];
    [self addSubview:self.green];
    self.green.hidden = YES;
}
@end

ViewController.m:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.red = [[RedView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];
    self.red.backgroundColor = [UIColor redColor];
    [self.view addSubview:self.red];
    [self.red loadRedView];
}

@end

Ответ 4

В целом такого метода нет. Вопрос в том, откуда взялся ваш _theView.

Если ваше представление, включая его подвью, загружается из одной и той же nib/xib/раскадровки, тогда вы можете использовать awakeFromNib, который будет вызываться после того, как полная иерархия объектов будет загружена из архива, поэтому ваш _theView должен также устанавливаться.

Если ваше представление создано программно, но не создает subview для самого _theView, это означает, что в вашем коде должно быть место, в которое вы добавляете этот subview. В этом случае у вас есть две опции

  • Либо скрыть _theView от вызывающего, после того как вы добавили его
  • Или объявите метод prepareForDisplay (или аналогичный) в классе просмотра и вызовите его после создания вашего представления и _theView. В этом prepareForDisplay (или любом другом имени, которое вы выберете) вы можете делать все, что захотите, например. Скрыть _theView.

Я бы не рекомендовал злоупотреблять layoutSubviews для этого, поскольку он предназначен для другой цели и будет вызываться несколько раз в течение всего времени просмотра, а не только один раз, как вы этого хотите. Да, вы можете сохранить, было ли это вызвано раньше, но я бы тоже подумал, что это взломать. Лучше создайте свой собственный метод для инициализации представления так, как вы хотите, после правильной настройки и вызовите его.

Ответ 5

layoutSubviews будет вызывать все виды, которые вы можете установить, как скрытые, вместо awakeFromNib. Если вы используете xib, вы можете установить скрытое свойство по умолчанию.