Who changed my mind? (on iOS)

Using an empty application template on Xcode 4.3.2, a project is created, so there is no NIB involved.

In FooViewController.m:

-(void) loadView {
    UIView *view = [[UIView alloc] init];
    view.backgroundColor = [UIColor yellowColor];
    self.view = view;                     
}

So, the view is created and created self.view. Two methods:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"self.view is %@", self.view);
}

-(void) viewDidAppear:(BOOL)animated {
    NSLog(@"self.view is %@", self.view);
}

The first method will print

self.view is <UIView: 0x18e4d0; frame = (0 0; 0 0); layer = <CALayer: 0x182a00>>

and second -

self.view is <UIView: 0x18e4d0; frame = (0 20; 768 1004); layer = <CALayer: 0x182a00>>

Thus, between viewDidLoadand the viewDidAppearimage changes. What mechanism changed its size? Can we count on this? Because even Matt Neuburg, author of iOS Programming, 2nd Edition, does it this way (as on page 508).

+3
source share
4 answers

ViewController. viewDidLoad , / . . viewWillAppear ( ). ViewDidAppear , , .

, viewDidLoad viewDidAppear , ViewController.

, viewDidLoad , (, - , ), viewWillAppear , .

, : http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDisplay-Notifications/RespondingtoDisplay-Notifications.html#//apple_ref/doc/uid/TP40007457-CH12

+3

self.view , . . viewWillAppear . , , .

self.view - , , . - self.view . , , self.view.

, UIKit , , , , , .. , , viewWillAppear, , . , self.view , , . viewWillDisplay self.view, , reset .

UIKit , , , , , subviews , UIKit .

0

, viewController view viewController a rootViewController application window. .

:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];

    FooViewController *viewController = [[FooViewController alloc] init];

    self.window.rootViewController = viewController; 
    [self.window makeKeyAndVisible];

    FooViewController *viewController2 = [[FooViewController alloc] init];
    [viewController.view addSubview: [viewController2 view]];

    return YES;
}

viewController viewController2 .

: viewController :

viewDidLoad
viewWillLayoutSubviews
viewDidLayoutSubviews
viewDidAppear

viewController2 viewDidLoad viewDidAppear.

: viewController , viewWillLayoutSubviews.

EDIT:

I thought it deserved further testing. Using the following code:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];

    FooViewController *viewController = [[FooViewController alloc] init];
    NSLog(@"after init: self.view is %@", viewController.view);
    self.window.rootViewController = viewController; 
    NSLog(@"after setting to rootViewController: self.view is %@", viewController.view);
    [self.window makeKeyAndVisible];
    NSLog(@"after makeKeyAndVisible: self.view is %@", viewController.view);

    return YES;
}

results:

viewDidLoad:                         frame = (0 0; 0 0)
after init:                          frame = (0 0; 0 0)
after setting to rootViewController: frame = (0 0; 0 0)
after makeKeyAndVisible:             frame = (0 20; 320 460)
viewWillLayoutSubviews:              frame = (0 20; 320 460)
viewDidLayoutSubviews:               frame = (0 20; 320 460)
viewDidAppear:                       frame = (0 20; 320 460)

So, is the culprit. [self.window makeKeyAndVisible];

0
source