Pytanie w sprawie ios, uiviewcontroller, uiview – iOS viewDidLoad dla UIView

52

W kontrolerze ViewController jestViewDidLoad wiedzieć, kiedy załadowano VC.

Dla UIView, jaką metodę muszę użyć, gdy widok jest załadowany?

Czy ta metoda zostanie wywołana z dowolnym init?

edytuj: Nie XIB, tylko programowo.

cześć dzięki, Im ładowanie widoku z viewController manuelBetancurt
Zależy od tego, skąd go załadowałeś ... borrrden

Twoja odpowiedź

7   odpowiedzi
2

Miałem podobny problem i znalazłem względnie łatwe rozwiązanie. Pomysł polega na wysłaniu viewDidLoad do każdego widoku dziecka w odpowiednim czasie i przeciążeniu tej metody w klasie, która Cię interesuje.

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

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

}
</code>
-1

O ile wiem, nie sądzę, aby istniała taka metoda z wyjątkiem init. Zazwyczaj przygotowuję w metodzie init. Możesz tworzyć własneviewDidLoad metoda i wywołaj ją ręcznie. Ale przez większość czasu UIView jest zarządzany przez kontroler widoku, więc kontroler widoku powinien wiedzieć, kiedy widok jest załadowany, jeśli chcesz skonfigurować widok, możesz to zrobić w kontrolerze widoku. Nawiasem mówiąc, theviewDidLoad metoda nie zawsze jest nazywana.

@ devios1, założyłbym, że podprogram został wstawiony programowo po viewDidLoad. moger777
nigdy nie widziałemviewDidLoad nie nazywa. W jakich okolicznościach nie zostałoby to wywołane? devios1
2

Możesz użyć willMove (doSuperview newSuperview: UIVi, ew?)

<code>import UIKit

final class myView: UIView {

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

} 
</code>

Apple Docs

37

Jeśli załadujesz go z pliku XIB, metoda awakeFromNib zostanie wywołana, gdy zostanie załadowana z XIB.

edytować W przypadku braku XIB prawdopodobnie będziesz musiał wywnioskować, używając jednej z metod zObserwowanie zmian związanych z widokiem obszardoktorzy (na przykład didMoveToSuperview). Jednak lepszym sposobem jest wysłanie wiadomości do swoich widoków z kontrolera widoku w metodzie viewDidLoad.

cześć dzięki edytuje moje pytanie, nie XIB, tylko programowo manuelBetancurt
doskonała odpowiedź, absolutnie poprawna! myusuf3
Czy uruchamia się ponownie, jeśli UIView jest ponownie załadowany? dumbledad
7

Właściwie nie musisz nic robić z metodą viewDidLoad (), aby inicjalizować widok. Wszystko, co chcesz zrobić, możesz zrobić w metodzie inicjowania widoku. Na przykład, w viewDidLoad kontrolera widoku (), jest jakiś kod inicjujący:

<code>- (void)viewDidLoad{
    [super viewDidLoad];

    // init your parameters here
}
</code>

Analogicznie, w metodzie początkowej twojego widoku:

<code>- (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;
}
</code>

Następnie tworzysz YourView z kontrolera widoku w ten sposób:

<code>YourView view = [[YourView alloc] initWithDelegate:self];
[self.view addSubview:view];
[view release];
</code>

Co więcej, rzeczy, które chcesz zrobić, gdy widok się ładował, możesz umieścić w widoku layoutSubviews, tak jak poniżej:

<code>-(void)layoutSubviews{
    [super layoutSubviews];

    // init your parameters here, like set up fonts, colors, etc...
}
</code>

Myślę, że tego potrzebujesz.

Twoje zdrowie!

6

Swift 2:

<code>import UIKit

class myView: UIView {

  override func layoutSubviews() {
    print("run when UIView appears on screen")
    // you can update your label's text or etc.
  }
}
</code>
Nie ma to nic wspólnego z Swift 2. Jest to punkt nadrzędny dla układu opartego na ograniczeniach. Cytowanie komentarza w framwork: „punkt nadpisania. Wywoływany automatycznie przez layoutIfNeeded. Od wersji iOS 6.0, gdy używany jest układ oparty na ograniczeniach, implementacja bazy stosuje układ oparty na ograniczeniach, w przeciwnym razie nic nie robi.” Paul Brewczynski
Ostrzeżenie: layoutSubviews może strzelać wiele razy iz pewnością nie jest miejscem, w którym można wykonać dowolny kod instalacyjny (taki jak viewDidLoad) Charlton Provatas
-6

To nie działa tak.

- (void)viewDidLoad nie jest wywoływany, gdy kontroler widoku jest załadowany; jest wywoływany, gdy ładowany jest widok kontrolera widoku.

Można więc utworzyć kontroler UIViewController, a jedynymi metodami, które zostaną wywołane, są metody inicjujące używane do inicjalizacji. Widok nie zostanie utworzony, nie zostanie wywołana metoda - (void) viewDidLoad itd.

Następnie, gdy coś innego poprosi kontrolera widoku o jego widok, za pośrednictwem:

<code>viewController.view;
</code>

Następnie kontroler widoku dzwoni:

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

Śledzony przez:

<code>- (void)viewDidLoad;
</code>

Zobacz Did Load jest oddzielną metodą, więc nie musisz przerywać rzeczywistej metody loadView i opcji ładowania złożonego widoku. Podklasowanie i nadpisywanie metody loadView w przypadku korzystania z nib itp. Może powodować problemy, gdy programiści nie są pewni, co robi Apple i jakie są ich najlepsze praktyki, więc Apple oddzielił metodę od siebie.

Następnie, gdy pojawia się ostrzeżenie o pamięci, widok jest zwalniany i ustawiany na zero:

<code>- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;
</code>
to jak to działa w uiviewcontroller NIE UIView ... ngb
Ta odpowiedź nie odzwierciedla absolutnie pytania ... pytający nie chce kontrolera widoku. KoreanXcodeWorker
poprawna odpowiedź jest tutajstackoverflow.com/a/4502761/2757496 kaushal

Powiązane pytania