В ViewController есть ViewDidLoad
, чтобы узнать, когда VC загружен.
Какой метод нужно использовать для UIView при загрузке представления?
Будет ли этот метод вызываться с любым init?
edit: Нет XIB, только программно.
В ViewController есть ViewDidLoad
, чтобы узнать, когда VC загружен.
Какой метод нужно использовать для UIView при загрузке представления?
Будет ли этот метод вызываться с любым init?
edit: Нет XIB, только программно.
Если вы загрузите его из файла XIB, метод awakeFromNib будет вызываться при его загрузке из XIB.
edit В случае отсутствия XIB вам, вероятно, придется сделать вывод, используя один из методов из области Наблюдение за изменениями, связанными с просмотром документы ( например, didMoveToSuperview). Однако лучший способ - отправить сообщение вашим представлениям из контроллера представления в методе viewDidLoad.
Вы можете использовать willMove (toSuperview newSuperview: UIView?)
import UIKit
final class myView: UIView {
override func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
//Do stuff here
}
}
На самом деле вам не нужно ничего делать с методом 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...
}
Думаю, это то, что вам нужно.
Ваше здоровье!
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.
}
}
У меня была аналогичная проблема, и я нашел относительно простое решение. Идея состоит в том, чтобы отправить 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. Обычно я занимаюсь подготовкой в методе инициализации. Вы можете создать свой собственный viewDidLoad
метод и вызывать его вручную. Но большую часть времени UIView управляется контроллером представления, поэтому этот контроллер представления должен знать, когда представление загружено. Если вы хотите настроить представление, вы можете сделать это в контроллере представления. Кстати, метод viewDidLoad
вызывается не всегда.
viewDidLoad
не звонили. При каких обстоятельствах он не будет называться?
- person devios1; 25.10.2013
Это не совсем так.
- (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;