2012-04-16 4 views
41

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

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

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

Редактировать: Нет XIB, только программно.

+0

Зависит от того, где вы загрузили его из ... – borrrden

+0

привет спасибо, Im загружает представление с viewController – MaKo

ответ

-6

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

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

Таким образом, вы можете создать UIViewController, и единственными методами, которые будут вызываться, являются методы init, используемые для его инициализации. Вид не будет создан, - (Недействительными) метод 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; 

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

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

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

это, как это работает в uiviewcontroller NOT UIView ... – ngb

+3

Этот ответ не совсем отражает точку зрения ... ассер не хочет видеть контроллер представления. –

+1

правильный ответ здесь http://stackoverflow.com/a/4502761/2757496 – kaushal

30

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

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

+0

привет спасибо отредактирует мой вопрос, нет XIB, ju st программно – MaKo

+0

отличный ответ, абсолютно правильный! – myusuf3

+0

Снова перезапускается ли перезагрузка UIView? – dumbledad

0

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

+5

Я никогда не видел 'viewDidLoad' * not * called. При каких обстоятельствах это нельзя было бы назвать? – devios1

2

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

} 
7

Actualy, вам не нужно ничего делать с методом зрения контроллера viewDidLoad() для инициализации вашего вида. Все, что вы хотите сделать, вы можете сделать в методе 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... 
} 

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

Cheers!

4

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. 
    } 
} 
+1

Это не имеет никакого отношения к Swift 2. Это переопределенная точка для компоновки с ограничениями. Ссылаясь на комментарий в фреймворке: «переопределенная точка», вызванная layoutIfNeeded автоматически. Начиная с iOS 6.0, при использовании макета на основе ограничений базовая реализация применяет макет, основанный на ограничениях, в противном случае он ничего не делает ». –

+2

Предупреждение: layoutSubviews может срабатывать несколько раз и, конечно же, не место для каких-либо установочных кодов (таких как viewDidLoad) –

1

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

import UIKit 

final class myView: UIView { 

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

Apple Docs

Смежные вопросы