iOS viewDidLoad для UIView

В ViewController есть ViewDidLoad, чтобы узнать, когда VC загружен.

Какой метод нужно использовать для UIView при загрузке представления?

Будет ли этот метод вызываться с любым init?

edit: Нет XIB, только программно.


person manuelBetancurt    schedule 16.04.2012    source источник
comment
Зависит от того, откуда вы его загрузили ...   -  person borrrden    schedule 16.04.2012
comment
привет, спасибо, я загружаю представление из viewController   -  person manuelBetancurt    schedule 16.04.2012


Ответы (7)


Если вы загрузите его из файла XIB, метод awakeFromNib будет вызываться при его загрузке из XIB.

edit В случае отсутствия XIB вам, вероятно, придется сделать вывод, используя один из методов из области Наблюдение за изменениями, связанными с просмотром документы ( например, didMoveToSuperview). Однако лучший способ - отправить сообщение вашим представлениям из контроллера представления в методе viewDidLoad.

person borrrden    schedule 16.04.2012
comment
привет, спасибо отредактирую мой вопрос, без XIB, просто программно - person manuelBetancurt; 16.04.2012
comment
Он снова срабатывает, если перезагрузить UIView? - person dumbledad; 17.06.2016

Вы можете использовать willMove (toSuperview newSuperview: UIView?)

import UIKit

final class myView: UIView {

  override func willMove(toSuperview newSuperview: UIView?) {
     super.willMove(toSuperview: newSuperview)
     //Do stuff here
   }

} 

Apple Docs

person davidrynn    schedule 31.01.2018

На самом деле вам не нужно ничего делать с методом viewDidLoad () контроллера представления для инициализации вашего представления. Все, что вы хотите сделать, вы можете сделать с помощью метода view init. Например, в viewDidLoad () контроллера представления есть некоторый код инициализации:

- (void)viewDidLoad{
    [super viewDidLoad];

    // init your parameters here
}

Аналогично, в методе инициализации вашего представления:

- (id)initWithDelegate:(id)_delegate
{
    self = [[[[NSBundle mainBundle] loadNibNamed:@"YourView" owner:self options:nil] objectAtIndex:0] retain];
    if (self) {
        [super init];

        self.delegate = _delegate;

        // init your parameters here

        return self;

    }
    return nil;
}

Затем вы создаете YourView из контроллера представления следующим образом:

YourView view = [[YourView alloc] initWithDelegate:self];
[self.view addSubview:view];
[view release];

Кроме того, то, что вы хотите сделать, когда ваше представление загрузилось, вы можете поместить в метод layoutSubviews в своем представлении, например:

-(void)layoutSubviews{
    [super layoutSubviews];

    // init your parameters here, like set up fonts, colors, etc...
}

Думаю, это то, что вам нужно.

Ваше здоровье!

person akelec    schedule 04.06.2014

Swift 2:

import UIKit

class myView: UIView {

  override func layoutSubviews() {
    print("run when UIView appears on screen")
    // you can update your label's text or etc.
  }
}
person fatihyildizhan    schedule 10.03.2016
comment
Это не имеет ничего общего со Swift 2. Это точка переопределения для компоновки на основе ограничений. Цитирование комментария во фреймворке: точка переопределения. вызывается layoutIfNeeded автоматически. Начиная с iOS 6.0, когда используется макет на основе ограничений, базовая реализация применяет макет на основе ограничений, в противном случае он ничего не делает. - person Paul Brewczynski; 09.01.2017
comment
Предупреждение: layoutSubviews может запускаться несколько раз и, конечно же, не место для выполнения какого-либо установочного кода (например, viewDidLoad) - person Charlton Provatas; 14.09.2017

У меня была аналогичная проблема, и я нашел относительно простое решение. Идея состоит в том, чтобы отправить viewDidLoad каждому дочернему представлению в нужное время и перегрузить этот метод для интересующего вас класса.

Для этого добавьте эти части кода в свои классы ...

//  UIViewController
- (void)viewDidLoad
{

    [super viewDidLoad];

    [self.view viewDidLoad];
}


//  UIView+Loading.m
#import < UIKit/UIKit.h>

@implementation UIView (Loading)

- (void)viewDidLoad
{

    for (UIView* subview in self.subviews)

        [subview viewDidLoad];
}

@end


//  UIView+Loading.h
#import < UIKit/UIKit.h>

@interface UIView (Loading)

- (void)viewDidLoad;

@end


// UIView_CustomImplementation

- (void)viewDidLoad
{

    NSLog(@"Do whatever you want to do in custom UIView after method viewDidLoad on UIViewController was called");

}
person vedrano    schedule 21.02.2013

Насколько мне известно, я не думаю, что существует такой метод, кроме init. Обычно я занимаюсь подготовкой в ​​методе инициализации. Вы можете создать свой собственный viewDidLoad метод и вызывать его вручную. Но большую часть времени UIView управляется контроллером представления, поэтому этот контроллер представления должен знать, когда представление загружено. Если вы хотите настроить представление, вы можете сделать это в контроллере представления. Кстати, метод viewDidLoad вызывается не всегда.

person Tranz    schedule 16.04.2012
comment
Я никогда не видел, чтобы viewDidLoad не звонили. При каких обстоятельствах он не будет называться? - person devios1; 25.10.2013
comment
@ devios1, я бы предположил, что если вы вставили подпредставление программно после viewDidLoad. - person moger777; 13.11.2018

Это не совсем так.

- (void)viewDidLoad не вызывается при загрузке контроллера представления; он вызывается при загрузке представления контроллера представления.

Таким образом, вы можете создать UIViewController, и единственные методы, которые будут вызываться, - это методы инициализации, используемые для его инициализации. Представление не будет создано, метод - (void) viewDidLoad не будет вызван и т. Д.

Затем, когда что-то еще запрашивает у контроллера представления его представление, через:

viewController.view;

Затем контроллер представления вызывает:

- (void)loadView; // This is where you put your own loading view information, and set the viewController's self.view property here.

С последующим:

- (void)viewDidLoad;

View Did Load - это отдельный метод, поэтому вам не нужно прерывать фактический метод loadView и параметры загрузки сложных представлений. Создание подклассов и переопределение метода loadView при использовании перьев и т. Д. Может привести к проблемам, когда разработчики не уверены, что делает Apple и каковы их передовые практики, поэтому для Apple было разумно выделить этот метод.

Затем, когда появляется предупреждение о памяти, представление освобождается и устанавливается в ноль:

- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;
person thebarcodeproject    schedule 16.04.2012
comment
Этот ответ не совсем отражает суть вопроса ... спрашивающий не хочет никакого контроллера представления. - person KoreanXcodeWorker; 01.04.2016