Frage an ios, uiviewcontroller, uiview – iOS viewDidLoad für UIView

52

In einem ViewController gibt esViewDidLoad zu wissen, wann der VC geladen hat.

Welche Methode muss ich beim Laden der Ansicht für eine UIView verwenden?

Würde diese Methode mit einem Init aufgerufen?

edit: Kein XIB, nur programmatisch.

Hallo, danke. Ich lade die Ansicht von einem viewController manuelBetancurt
Kommt drauf an, woher du es geladen hast ... borrrden

Deine Antwort

7   die antwort
-6

- (void)viewDidLoad wird beim Laden des View Controllers nicht aufgerufen; Es wird aufgerufen, wenn die Ansicht des View Controllers geladen wird.

Sie können also den UIViewController erstellen, und die einzigen Methoden, die aufgerufen werden, sind die init-Methoden, die zur Initialisierung verwendet werden. Die Ansicht wird nicht erstellt, die Methode - (void) viewDidLoad wird nicht aufgerufen usw.

Wenn der Ansichts-Controller dann von einem anderen Benutzer nach seiner Ansicht gefragt wird, über:

<code>viewController.view;
</code>

Der View Controller ruft dann auf:

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

Gefolgt von:

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

View Did Load ist eine separate Methode, damit Sie die tatsächliche loadView-Methode und die Ladeoptionen für komplexe Ansichten nicht unterbrechen müssen. Das Unterklassen und Überschreiben der loadView-Methode bei der Verwendung von Schreibfedern usw. kann zu Problemen führen, wenn Entwickler nicht sicher sind, was Apple tut und welche Best Practices sie anwenden. Daher war es für Apple klug, die Methode zu trennen.

Wenn eine Speicherwarnung angezeigt wird, wird die Ansicht freigegeben und auf null gesetzt:

<code>- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;
</code>
so funktioniert es in uiviewcontroller NICHT UIView ... ngb
Diese Antwort spiegelt nicht unbedingt die Fragestellung wider ... der Fragesteller möchte keinen View Controller. KoreanXcodeWorker
Die richtige Antwort ist hierstackoverflow.com/a/4502761/2757496 kaushal
37

wird die awakeFromNib-Methode aufgerufen, wenn es aus der XIB geladen wird.

bearbeiten Wenn Sie kein XIB verwenden, müssen Sie es wahrscheinlich mit einer der Methoden aus dem ableitenAnsichtsbezogene Änderungen beobachten Gebiet vondie docs (Zum Beispiel didMoveToSuperview). Besser ist es jedoch, eine Nachricht vom Ansichtscontroller in der viewDidLoad-Methode an Ihre Ansichten zu senden.

ausgezeichnete Antwort, absolut richtig! myusuf3
Wird es erneut ausgelöst, wenn UIView neu geladen wird? dumbledad
hi danke werde meine frage bearbeiten, kein xib, nur programmatisch manuelBetancurt
-1

gibt es eine solche Methode nur für den Init. Normalerweise mache ich die Vorbereitung in der Init-Methode. Sie können Ihre eigenen erstellenviewDidLoad Methode und rufen Sie es manuell auf. In den meisten Fällen wird UIView jedoch von seinem Ansichtscontroller verwaltet, sodass der Ansichtscontroller wissen sollte, wann die Ansicht geladen wird. Wenn Sie die Ansicht konfigurieren möchten, können Sie dies im Ansichtscontroller tun. Übrigens, dieviewDidLoad Methode wird nicht immer aufgerufen.

@ devios1, ich würde annehmen, wenn Sie die Unteransicht programmgesteuert nach viewDidLoad einfügen. moger777
ich habe noch nie gesehenviewDidLoad nicht namens. Unter welchen Umständen würde es nicht genannt werden? devios1
6

Swift 2:

<code>
class myView: UIView {

  override func layoutSubviews() {
    print("run when UIView appears on screen")
    // you can update your label's text or etc.
  }
}
</code>
Warnung: layoutSubviews kann mehrmals ausgelöst werden und ist mit Sicherheit nicht der richtige Ort, um Setup-Code (wie viewDidLoad) auszuführen. Charlton Provatas
Dies hat nichts mit Swift 2 zu tun. Es ist ein Überschreibungspunkt für ein auf Einschränkungen basierendes Layout. Zitieren des Kommentars in Framwork: "Punkt überschreiben. Wird von layoutIfNeeded automatisch aufgerufen. Ab iOS 6.0 wendet die Basisimplementierung bei Verwendung eines einschränkungsbasierten Layouts das einschränkungsbasierte Layout an, andernfalls wird nichts ausgeführt." Paul Brewczynski
2

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

7

lers nichts tun, um die Initialisierung Ihrer View durchzuführen. Alles, was Sie tun möchten, können Sie in der init-Methode von view tun. In viewDidLoad () des View Controllers gibt es beispielsweise einen Initialisierungscode:

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

    // init your parameters here
}
</code>

Analog dazu lautet die init-Methode Ihrer Ansicht:

<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>

Anschließend erstellen Sie YourView über den View Controller wie folgt:

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

Außerdem können Sie Dinge, die Sie tun möchten, als Ihre Ansicht geladen wurde, in die layoutSubviews-Methode in Ihrer Ansicht einfügen:

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

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

Ich denke, das ist was du brauchst.

Prost!

2

Die Idee ist, viewDidLoad zur richtigen Zeit an jede untergeordnete Ansicht zu senden und diese Methode in der Klasse Ihres Interesses zu überladen.

Fügen Sie dazu diese Teile des Codes in Ihre Klassen ein ...

<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>

Verwandte Fragen