2013-08-12 2 views
2

Это мой первый проект iOS. Я просто слежу за учебником от Try iOS в учебном кодексе в моем приложении XCode.viewDidLoad не вызван для rootViewController

Я добавил кнопку в свой метод 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 «отправляет сообщения».

Если какая-либо дополнительная информация может помочь, пожалуйста, сообщите мне. Спасибо за любую помощь :)

EDIT

ли это что-то делать с раскадровки? Я в режиме раскадровки, но я никогда не добавлял никаких кнопок с помощью GUI.

ответ

1

viewDidLoad не вызывается из-за нестандартного способа создания его представления. Обычно представление загружается из xib или раскадровки или создается в коде в методе loadView контроллера вида - во всех этих случаях будет вызываться viewDidLoad. Если вы переместите свое представление в loadView в файле .m-файла контроллера, он будет работать, и будет вызван viewDidLoad.

После Edit:

Если вы используете раскадровки, ваш взгляд должен быть создан там, и вы не должны делать то, что вы делаете в приложение делегата. Фактически, когда вы используете раскадровку, у вас обычно нет кода в приложении: doneFinishLaunchingWithOptions: method.

+0

Спасибо, я просто сделаю это в будущем.Я пытался следовать их примерам, но они, возможно, были отредактированы, чтобы сделать класс более удобным. – MrCarder

+2

@MrCarder, странный класс. Редактируя их материал, чтобы он был неправильным ... Вы должны получить хороший учебник (легко найти в Google, я бы предложил Ray Wenderlich или App Coda), чтобы понять, как это сделать (я не хочу сказать " правильный путь ", но вы знаете, что я имею в виду) – CaptJak

+0

Чтобы добавить к тому, что написал @CaptJak: я обнаружил, что трудно исправить соблазн сделать что-то вручную вручную - это не отличная идея. Используйте Interface Builder и соглашения и рабочие процессы Apple каждый раз, когда вы можете, а не подключайте их вручную, ради этого; это не только экономит ваше время, но, что более важно, вы не оказываетесь в непреднамеренной борьбе против структур и соглашений программирования Objective-C/Cocoa/Xcode, что является основной проблемой в приведенном выше примере кода. – davidf2281

0

Посмотрев на код, это именно то, что должно происходить. Когда вы создаете viewController, он автоматически создает представление, поэтому вы не хотите создавать для него новый. Ваша кнопка не отображается, потому что она находится на исходном представлении, созданном с помощью viewController, но вы перезаписали ее с помощью своего желтого вида.

Вместо того, что вы хотите сделать, это пойти в ViewController.m «s viewDidLoad:(BOOL)animated и добавить:

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

Кроме того, убедитесь, что вы не установили viewController.view в AppDelegate. Если вы не установите это, автоматически создается представление, и вы можете добавить к нему кнопку или другие виды в viewDidLoad.

0

У меня была эта проблема, и была вызвана функция initWithCoder, когда я добавил код в функцию didFinishLaunchingWithOptions приложения AppDelegate.

- (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]; 
1

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

Вы не должны установить вид ViewController перед тем viewDidLoad, которые вызывают viewDidLoad не называется. Просмотр должен быть установлен в viewDidLoad, и viewController автоматически будет управлять вашим представлением.

Смежные вопросы