iPhone 抖动问题:加载 viewController 时未调用 viewDidAppear

Posted

技术标签:

【中文标题】iPhone 抖动问题:加载 viewController 时未调用 viewDidAppear【英文标题】:Problem with iPhone shakes: viewDidAppear isn't called when loading viewController 【发布时间】:2010-02-25 16:38:08 【问题描述】:

我正在尝试检测 iPhone 设备上的震动,因此对于我所读到的内容,我需要将我的视图控制器设置为 viewDidAppear 方法的第一响应者。这个方法应该被自动调用,但由于某种原因,这个方法永远不会被调用。仅调用 viewDidLoad。

这是我的代码(我只放了相关部分):

BuildHouseViewController.h:

@interface BuildHouseViewController : UIViewController

BuildHouseViewController.m:

- (void)viewDidLoad 
[super viewDidLoad];
[self.view becomeFirstResponder];

-(void)viewDidAppear:(BOOL)animated
[self becomeFirstResponder];
[super viewDidAppear:animated];

-(BOOL)canBecomeFirstResponder 
return YES;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event

NSLog(@"shake"); 
if ( event.subtype == UIEventSubtypeMotionShake )
  

if ( [super respondsToSelector:@selector(motionEnded:withEvent:)] )
    [super motionEnded:motion withEvent:event];

我在 viewDidAppear 方法上添加了断点,但它从未被调用过。永远不会检测到震动,我想这是因为从未调用过此方法,因此视图控制器永远不会成为第一响应者。我不明白为什么会这样。

任何帮助将不胜感激。

编辑:

我使用以下方法从另一个视图调用视图:

[self.view addSubview:nextScreen.view];

视图显示在屏幕上

【问题讨论】:

显示创建和显示 BuildHouseViewController 的代码(将其添加到问题中)。 【参考方案1】:

感谢您的快速回答。

我发现了一些有趣的东西。我尝试以不同的方式加载我遇到问题的同一个视图,但我得到了不同的结果

-正如我之前所说,如果我从另一个视图调用它:

[self.view addSubview:nextScreen.view];

viewDidLoad 从未被调用,我无法检测到抖动。

-现在,如果我从 AppDelegate 调用它:

[window addSubview:nextScreen.view];

viewDidLoad 被调用!!并且我能够检测到抖动,但是这个解决方案是不可能的,我应该能够从另一个视图调用它

-如果我从另一个视图调用它:

[self presentModalViewController:nextScreen animated:YES];

viewDidLoad 被调用!!但是我不想使用模态视图控制器,但它似乎是解决我的问题的唯一方法,检测到抖动。

奇怪的是第一种方法没有正确加载视图,是不是bug??

【讨论】:

【参考方案2】:

[self becomeFirstResponder] 之类的实际上并没有使它成为第一响应者。当视图将成为第一响应者时,将调用该方法。所以这不是你认为的那样。

其次,viewDidAppear 只会在视图确实出现时被调用。它是否出现在屏幕上?你说它在哪里显示?您需要将视图控制器的视图添加为另一个视图的子视图,或者推送到导航控制器堆栈,或者作为模式视图推送。

【讨论】:

见:***.com/questions/1111150/… 根据 UIResponder becomeFirstResponder 的文档:“您可以调用此方法来使响应者对象(例如视图)成为第一响应者。但是,如果它是视图层次结构。如果视图的 window 属性包含 UIWindow 对象,则它已安装在视图层次结构中;如果返回 nil,则视图与任何层次结构分离。所以看起来它实际上应该让接收者成为第一响应者。【参考方案3】:

viewDidAppear:(BOOL)animated 仅在 UINavigationController 或 UITabBarController 显示视图时调用。如果您将视图控制器的视图添加到子视图(例如滚动视图或您拥有的),它将不会被调用。你会认为它会,但你错了。我自己也被这个咬了。

【讨论】:

【参考方案4】:

进一步@Genericrich的cmets,你可以在自己把子视图放入后手动调用viewDidAppear。

[self.view addSubview:theViewController.view];
[theViewController viewDidAppear:FALSE];

这对我有用。希望对其他人有所帮助。

【讨论】:

以上是关于iPhone 抖动问题:加载 viewController 时未调用 viewDidAppear的主要内容,如果未能解决你的问题,请参考以下文章

ios App检查iPhone抖动然后拍照

iphone检测整个应用程序的抖动

从“开始 Iphone 4 开发”中调整抖动代码导致崩溃

如何将 iPhone 抖动手势检测限制在特定情况下?

使用 iPhone/iPad 中的加速度计进行水平和垂直抖动计数

Vue—解决页面图片加载抖动的问题