iOS viewDidLoad dla UIView

W kontrolerze ViewController jest ViewDidLoad, aby wiedzieć, kiedy VC się załaduje.

W przypadku UIView, jakiej metody muszę użyć, gdy widok jest załadowany?

Czy ta metoda byłaby wywoływana z dowolnym init?

Edytuj: Nie XIB, tylko programowo.

Author: Patrice Gahide, 2012-04-16

7 answers

To nie działa w ten sposób.

- (void)viewDidLoad nie jest wywoływana, gdy kontroler widoku jest ładowany; jest wywoływana, gdy kontroler widoku jest ładowany.

Możesz więc utworzyć Kontroler UIViewController, a jedynymi metodami, które zostaną wywołane, są metody init użyte do jego inicjalizacji. Widok nie zostanie utworzony, nie zostanie wywołana metoda - (void)viewDidLoad, itd.

Wtedy, gdy coś innego zapyta kontroler widoku o jego Widok, poprzez:

viewController.view;

Kontroler widoku następnie wywołuje:

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

, po którym następuje:

- (void)viewDidLoad;

View did Load jest oddzielną metodą, więc nie musisz przerywać rzeczywistej metody loadView i złożonych opcji ładowania widoku. Podklasowanie i nadpisywanie metody loadView podczas korzystania z nibs etc może powodować problemy, gdy deweloperzy nie są pewni, co robi Apple i jakie są ich najlepsze praktyki, więc Apple mądrze oddzieliło metodę.

Następnie, gdy pojawia się ostrzeżenie o pamięci, widok jest zwalniany i ustawiany na "nil": {]}

- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;
 -6
Author: thebarcodeproject,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-16 01:34:13

Jeśli załadujesz ją z pliku XIB, metoda awakeFromNib zostanie wywołana podczas ładowania z XIB.

Edit w przypadku braku XIB, prawdopodobnie będziesz musiał wywnioskować to za pomocą jednej z metod z obserwując zmiany związane z widokiem obszaru docs (na przykład didMoveToSuperview). Jednak lepszym sposobem jest wysłanie wiadomości do widoków z kontrolera widoku w metodzie viewDidLoad.

 37
Author: borrrden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-16 01:32:23

W rzeczywistości, nie musisz nic robić z metodą kontrolera widoku viewDidLoad (), aby zainicjować widok. Wszystko, co chcesz zrobić, możesz zrobić w view ' s INIT method. Na przykład w funkcji kontrolera widoku viewDidLoad () znajduje się kod inicjalizacji:

- (void)viewDidLoad{
    [super viewDidLoad];

    // init your parameters here
}

Analogicznie, Twoim zdaniem metoda 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;
}

Następnie tworzysz widok z kontrolera widoku w następujący sposób:

YourView view = [[YourView alloc] initWithDelegate:self];
[self.view addSubview:view];
[view release];

Dalej, rzeczy, które chcesz zrobić, gdy twój widok nie załadować, można umieścić w metoda layoutsubview w Twoim widoku, jak Ta:

-(void)layoutSubviews{
    [super layoutSubviews];

    // init your parameters here, like set up fonts, colors, etc...
}
Myślę, że tego właśnie potrzebujesz. Zdrówko!
 7
Author: akelec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-04 08:29:27

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.
  }
}
 5
Author: fatihyildizhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 17:54:43

Miałem podobny problem i znalazłem stosunkowo łatwe rozwiązanie. Ideą jest wysłanie viewDidLoad do każdego widoku potomnego w odpowiednim czasie i przeciążenie tej metody na interesującej Cię klasie.

Aby to zrobić, dodaj tę część kodu do swoich klas...

//  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");

}
 2
Author: vedrano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-25 10:55:02

Możesz użyć willMove (toSuperview newSuperview: UIView?)

import UIKit

final class myView: UIView {

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

} 

Apple Docs

 1
Author: davidrynn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 19:16:31

Z tego co wiem, to chyba nie ma takiej metody poza init. Zazwyczaj preparat wykonuję metodą init. Możesz utworzyć własną metodę viewDidLoad i wywołać ją ręcznie. Ale przez większość czasu UIView jest zarządzany przez kontroler widoku, więc kontroler widoku powinien wiedzieć, kiedy widok jest ładowany, jeśli chcesz skonfigurować Widok, możesz to zrobić w kontrolerze widoku. Nawiasem mówiąc, metoda viewDidLoad nie zawsze jest wywoływana.

 -1
Author: Tranz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-16 19:31:17