不为rootViewController调用viewDidLoad

时间:2013-08-12 00:48:06

标签: ios objective-c xcode

这是我的第一个iOS项目。我只是在我的XCode应用程序中的代码学习中试用了iOS的教程。

我在viewDidLoad方法中添加了一个按钮。我不认为这是正常添加的地方,但它应该仍然有效。问题是,从不调用该方法。到目前为止,这是我的代码:

AppDelegate.m:

    #import "AppDelegate.h"
#import "ViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Set window size & background color
    CGRect viewRect = [[UIScreen mainScreen] bounds];
    self.window = [[UIWindow alloc] initWithFrame:viewRect];
    self.viewController = [[ViewController alloc] init];
    UIView *view = [[UIView alloc] initWithFrame:viewRect];

    view.backgroundColor = [UIColor yellowColor];

    self.viewController.view = view;

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

    NSLog(@"Screen is %f tall and %f wide", viewRect.size.height, viewRect.size.width);

    return YES;
}...


AppDelegate.h:

#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;

@end



ViewController.m:

    #import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blueColor];

    UIButton *firstButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    firstButton.frame = CGRectMake(100, 100, 100, 44);
    [firstButton setTitle:@"Don't Click!" forState:UIControlStateNormal];
    [self.view addSubview:firstButton];
}...

当应用程序启动并运行时,我的背景仍为黄色,并且没有可见的按钮。

单步执行应用程序,didFinishLaunchingWithOptions:按预期点击。初始化视图时,我希望viewDidLoad能够运行。我可能只是误解了C“发送消息”的方式。

如果有任何其他信息可能会有所帮助,请告诉我们。感谢您的帮助:))

修改

这与故事板有关吗?我处于故事板模式但我从未使用GUI添加任何按钮

4 个答案:

答案 0 :(得分:1)

由于您正在创建其视图的非标准方式,因此未调用viewDidLoad。通常,视图是从xib或storyboard加载的,或者是在视图控制器的loadView方法中的代码中创建的 - 在所有这些情况下,都将调用viewDidLoad。如果将视图创建移动到控制器的.m文件中的loadView,它将起作用,并且将调用viewDidLoad。

编辑后:

如果您正在使用故事板,那么您的视图应该在那里创建,而您不应该在应用程序委托中执行您正在执行的操作。实际上,当您使用故事板时,通常在应用程序中没有任何代码:didFinishLaunchingWithOptions:method。

答案 1 :(得分:1)

... self.viewController.view = view; ...

你不应该在viewDidLoad之前设置viewController的视图,这会导致viewDidLoad没有被调用。应该在viewDidLoad中设置视图,viewController将自动为您管理其视图。

答案 2 :(得分:0)

查看代码,这正是应该发生的事情。创建viewController时,它会自动创建一个视图,因此您不希望为其创建新视图。您的按钮没有显示,因为它位于使用viewController创建的原始视图上,但是您用黄色视图覆盖了它。

相反,您想要做的是进入ViewController.m的{​​{1}}并添加:

viewDidLoad:(BOOL)animated

另外,请确保未在appDelegate中设置viewController.view。如果您未设置该视图,则会自动创建视图,您可以在viewDidLoad中向其添加按钮或任何其他视图。

答案 3 :(得分:0)

我遇到了这个问题,当我在AppDelegate的didFinishLaunchingWithOptions函数中添加了一些代码时,调用了initWithCoder函数。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];(NSDictionary *)launchOptions
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardName" bundle:nil];
    UIViewController *initViewController = [storyboard instantiateInitialViewController];
    [self.window setRootViewController:initViewController];