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

时间:2010-02-25 16:38:08

标签: iphone viewcontroller shake viewdidappear

我正在尝试检测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];

视图显示在屏幕上

4 个答案:

答案 0 :(得分:1)

感谢您的快速解答。

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

- 如前所述,如果我使用以下方式从另一个视图中调用它:

[self.view addSubview:nextScreen.view];

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

- 如果我使用以下方式从AppDelegate调用它:

[window addSubview:nextScreen.view];

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

- 如果我使用以下方式从另一个视图调用它:

[self presentModalViewController:nextScreen animated:YES];

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

奇怪的是,第一种方法没有正确加载视图,这是一个错误吗?

答案 1 :(得分:0)

[self becomeFirstResponder]等实际上并没有使它成为第一个响应者。当视图成为第一个响应者时,将调用该方法。所以这不符合你的想法。

其次,只有当视图出现时才会调用viewDidAppear。它出现在屏幕上吗?你在哪里告诉它显示?您需要将视图控制器的视图添加为另一个视图的子视图,或者将其推送到导航控制器堆栈,或者将其作为模态视图推送。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

除了@ Genericrich的评论之外,您可以在将子视图放入自己后手动调用viewDidAppear。

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

这对我有用。希望它可以帮助别人。