3

这是我的第一个 iOS 项目。我只是在我的 XCode 应用程序中按照在 codeschool 上的 Try iOS over 的教程进行操作。

我在我的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

4 回答 4

2

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

编辑后:

如果您使用的是故事板,您的视图应该在那里创建,并且您不应该做您在应用程序委托中所做的事情。实际上,当您使用情节提要时,通常在 application:didFinishLaunchingWithOptions: 方法中没有任何代码。

于 2013-08-12T01:00:55.467 回答
1

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

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

于 2015-11-25T03:23:44.037 回答
0

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

相反,您要做的是进入ViewController.m'sviewDidLoad:(BOOL)animated并添加:

[self.view setBackgroundColor:[UIColor yellowColor]];

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

于 2013-08-12T00:59:38.860 回答
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];
于 2014-04-07T17:24:30.467 回答