从Xcode启动应用程序和从设备启动之间有区别吗?

时间:2015-11-20 13:22:51

标签: ios objective-c iphone xcode

我的View上有几个按钮,当应用程序启动时,它们应该围绕它们的x轴旋转。当我从Xcode(Build然后运行当前方案)启动应用程序时,它们会翻转,但是当我在iPhone上打开应用程序时,它们不会翻转。

我的ViewController中的viewDidLoad如下所示:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    model =[[Model alloc] init];
    GameView *gameView = [[GameView alloc] initWithTiles];
    gameView.controller = self;
    self.view = gameView;

    [self flipButtons];
}

当我从手机启动应用程序时,为什么按钮不会翻转?

如果您需要其他信息,请告诉我们:)

修改

这是翻转按钮并为每个按钮调用的方法:

- (void)flip:(Color*)color {

int flipDirection = arc4random() % 2;
if(flipDirection == 0) flipDirection = -1;

double duration = 200 + arc4random() % (500 - 200);
duration = duration / 1000;


// Animation
[UIView animateWithDuration:duration
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                 animations:^{
                     self.layer.transform = CATransform3DMakeRotation(M_PI, 0, flipDirection, 0);
                     // wait duration /2 and call changeColor
                     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((duration / 2) * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                         [self changeColor:color];
                     });
                 }
                 completion:^(BOOL finished) {
                     self.layer.transform = CATransform3DMakeRotation(M_PI, 0, 0, 0);
                 }];

}

1 个答案:

答案 0 :(得分:2)

viewDidLoad并不一定意味着视图在屏幕上。您应该使用viewWillAppear:viewDidAppear

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    model =[[Model alloc] init];
    GameView *gameView = [[GameView alloc] initWithTiles];
    gameView.controller = self;
    self.view = gameView;
}

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated];
    [self flipButtons];
}

viewDidLoad仅表示视图控制器的视图已被实例化,到那时所有IBOutlet都已连线。您只应在此处执行其他初始化,并且不得依赖于调用viewDidLoad或是否多次调用等等(例如,您可以使用self.view = nil卸载视图控制器的视图它没有superview,并且在需要时会自动重新加载。

为什么这是必要的: UIViewController懒散地加载它view。当您使用例如UIViewController实例化initWithNibName:bundle:时,它不会立即加载笔尖;那会浪费资源。根据{{​​3}}:

  

您指定的nib文件不会立即加载。它载入了   第一次访问视图控制器的视图。如果你想   加载nib文件后执行其他初始化   覆盖viewDidLoad方法并在那里执行任务。

所以,当第一次查询视图控制器的view时,会发生加载(请参阅:Apple's documentation)并发出viewDidLoad次调用您可以使用所有子视图调整视图并设置IBOutlets

加载视图后,视图控制器的状态转换将在此图中描述:

Order of UIViewController initialization and loading

初始状态为disappeared