В ViewController существует ViewDidLoad
, чтобы знать, когда загружен VC.
Для UIView, какой метод мне нужно использовать при загрузке представления?
Будет ли этот метод вызываться с любым init?
изменить: Нет XIB, просто программно.
В ViewController существует ViewDidLoad
, чтобы знать, когда загружен VC.
Для UIView, какой метод мне нужно использовать при загрузке представления?
Будет ли этот метод вызываться с любым init?
изменить: Нет XIB, просто программно.
Это не совсем так.
- (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;
Если вы загрузите его из XIB файла, метод awakeFromNib будет вызываться, когда он будет загружен из XIB.
edit В случае отсутствия XIB вам, вероятно, придется вывести его с использованием одного из методов из области Наблюдение, связанные с изменениями документы (например, didMoveToSuperview). Однако лучше всего отправить сообщение в свои представления из контроллера вида в методе viewDidLoad.
Фактически, вам не нужно ничего делать с помощью метода 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...
}
Думаю, это то, что вам нужно.
Ура!
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.
}
}
У меня была аналогичная проблема и нашел относительное простое решение. Идея заключается в том, чтобы отправить 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");
}
Насколько я знаю, я не думаю, что есть такой метод, кроме init. Обычно я делаю подготовку в методе init. Вы можете создать свой собственный метод viewDidLoad
и вызвать его вручную. Но большую часть времени UIView управляется контроллером просмотра, поэтому контроллер представления должен знать, когда загружается представление, если вы хотите настроить представление, вы можете сделать это в контроллере представления. Кстати, метод viewDidLoad
не всегда называется.