Вопрос по ios, uiview – iOS viewDidLoad для UIView
В ViewController естьViewDidLoad
знать, когда VC загрузился.
Для UIView, какой метод я должен использовать при загрузке представления?
Будет ли этот метод вызываться с любым init?
редактировать: Нет XIB, только программно.
Swift 2:
class myView: UIView {
override func layoutSubviews() {
print("run when UIView appears on screen")
// you can update your label's text or etc.
}
}
я не думаю, что существует такой способ, кроме init. Обычно я делаю подготовку в методе init. Вы можете создать свой собственныйviewDidLoad
метод и вызвать его вручную. Но большую часть времени UIView управляется его контроллером представления, так что контроллер представления должен знать, когда представление загружено, если вы хотите сконфигурировать представление, вы можете сделать это в контроллере представления. Кстати,viewDidLoad
метод не всегда вызывается.
и я нашел относительно простое решение. Идея состоит в том, чтобы отправить 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");
}
метод awakeFromNib будет вызываться при загрузке из XIB.
edit В случае отсутствия XIB вам, вероятно, придется вывести его, используя один из методов изObserving View-Related Changes зонадокументы (например, didMoveToSuperview). Тем не менее, лучшим способом является отправка сообщения вашим представлениям из контроллера представления в методе 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...
}
Я думаю, это то, что вам нужно.
Ура!
- (void)viewDidLoad
не вызывается, когда загружен контроллер представления; он вызывается, когда загружается представление контроллера представления.
Таким образом, вы можете создать UIViewController, и единственные методы, которые будут вызываться, это методы init, используемые для его инициализации. Представление не будет создано, метод - (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 было разумным разделить метод.
Затем, когда появляется предупреждение о памяти, представление освобождается и устанавливается равным nil:
- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;