【问题标题】:Is there a difference between starting the app from Xcode and starting from the device?从 Xcode 启动应用程序和从设备启动有区别吗?
【发布时间】:2015-11-20 13:22:51
【问题描述】:

我的视图上有几个按钮,当应用启动时,它们应该围绕 x 轴翻转。当我从 Xcode 启动应用程序(构建然后运行当前方案)时,它们会翻转,但是当我在 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);
                 }];

}

【问题讨论】:

  • 你说你的按钮在模拟器中翻转,而不是在设备中?
  • @Kathiravan 不,他们在我的设备上翻转,但前提是我从 Xcode 启动应用程序。
  • 在您的翻转按钮方法中添加 NSlog。在设备中启动您的应用程序并在 Xcode 中检查设备控制台,检查您的方法是否被调用。
  • dispatch_after 应该在完成块中。
  • @TamásZahola 请问为什么?

标签: ios objective-c iphone xcode


【解决方案1】:

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 仅表示视图控制器的视图已被实例化,并且此时所有IBOutlets 都已连接。您应该只在此处进行额外的初始化,并且不能依赖于何时调用 viewDidLoad 或是否多次调用它等(例如,如果没有 @987654333,您可以使用 self.view = nil 卸载视图控制器的视图@,它会在需要时自动重新加载)。

为什么这是必要的: UIViewController 懒惰地加载它是 view。当您使用例如 initWithNibName:bundle: 实例化 UIViewController 时,它不会立即加载笔尖;那将是资源的浪费。根据Apple's documentation

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

所以发生的情况是,当第一次查询视图控制器的 view 时,加载发生(参见:Order of UIViewController initialization and loading)并发出 viewDidLoad 调用,以便您可以对视图进行调整子视图和IBOutlets 设置。

加载视图后,视图控制器的状态转换如下图所示:

初始状态为disappeared

【讨论】:

  • 那么请向我们提供您的flipButtons方法的实现。
  • 很抱歉打扰您,但我现在仍然不知道该怎么办?
  • 我发现它运行了翻转方法,因为它改变了按钮颜色但不知何故不做动画。
  • @Dalibor 按钮颜色肯定不会被动画化,因为它没有在动画块中设置。您只是调度动画块中的颜色变化块。您应该使用 duration/2 延迟将其作为单独的动画来执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2014-07-22
  • 2021-04-25
  • 1970-01-01
  • 2014-04-18
相关资源
最近更新 更多