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

IOS viewDidLoad для UIView

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

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

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

изменить: Нет XIB, просто программно.

4b9b3361

Ответ 1

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

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

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

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

viewController.view;

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

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

Далее следуют:

- (void)viewDidLoad;

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

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

- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;

Ответ 2

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

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

Ответ 3

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

- (void)viewDidLoad{
    [super viewDidLoad];

    // init your parameters here
}

Аналогично, в вашем методе init:

- (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...
}

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

Ура!

Ответ 4

Swift 2:

import UIKit

class myView: UIView {

  override func layoutSubviews() {
    print("run when UIView appears on screen")
    // you can update your label text or etc.
  }
}

Ответ 5

У меня была аналогичная проблема и нашел относительное простое решение. Идея заключается в том, чтобы отправить 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");

}

Ответ 6

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