iPhone震动的问题:ViewDidIs';加载viewController时未调用
我正在尝试检测iPhone设备上的震动,因此,就我所读到的内容而言,我需要将我的视图控制器设置为ViewDidAspect方法上的第一响应程序。本应自动调用此方法,但由于某些原因,从未调用此方法。仅调用viewDidLoad 这是我的代码(我只放了相关部分): BuildHouseViewController.h: @界面BuildHouseViewController:UIViewController{ BuildHouseViewController.m:iPhone震动的问题:ViewDidIs';加载viewController时未调用,iphone,viewcontroller,shake,viewdidappear,Iphone,Viewcontroller,Shake,Viewdidappear,我正在尝试检测iPhone设备上的震动,因此,就我所读到的内容而言,我需要将我的视图控制器设置为ViewDidAspect方法上的第一响应程序。本应自动调用此方法,但由于某些原因,从未调用此方法。仅调用viewDidLoad 这是我的代码(我只放了相关部分): BuildHouseViewController.h: @界面BuildHouseViewController:UIViewController{ BuildHouseViewController.m: - (void)viewDidLo
- (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];
}
我在ViewDidAspect方法上添加了断点,它从未被调用。从未检测到震动,我想这是因为这些方法从未被调用,因此视图控制器永远无法成为第一响应者。我不明白为什么会发生这种情况
任何帮助都将不胜感激
编辑:
我使用以下命令从另一个视图调用该视图:
[self.view addSubview:nextScreen.view];
[self.view addSubview:nextScreen.view];
[self presentModalViewController:nextScreen animated:YES];
视图显示在屏幕上,而[self becomeFirstResponder]等实际上并不会使其成为第一响应者。当视图将成为第一响应者时,会调用该方法。因此,这并不是您所认为的那样
其次,只有当视图确实出现时才会调用ViewDidDisplay。它是否显示在屏幕上?您告诉它显示在哪里?您需要将视图控制器的视图添加为另一个视图的子视图,或者推送到导航控制器堆栈上,或者推送到模式视图上。谢谢您的快速回答。 我发现了一些有趣的东西。我试着以不同的方式加载我遇到问题的同一个视图,得到了不同的结果 -如前所述,如果我从另一个视图调用它,使用:
[self.view addSubview:nextScreen.view];
[self.view addSubview:nextScreen.view];
[self presentModalViewController:nextScreen animated:YES];
viewDidLoad从未调用,我无法检测到震动
-现在,如果我使用以下命令从AppDelegate调用它:
[window addSubview:nextScreen.view];
调用viewDidLoad!!我能够检测震动,但是这个解决方案是不可能的,我应该能够从另一个视图调用它
-如果我使用以下命令从另一个视图调用它:
[self.view addSubview:nextScreen.view];
[self.view addSubview:nextScreen.view];
[self presentModalViewController:nextScreen animated:YES];
调用viewDidLoad!!但是我不想使用模态视图控制器,但它似乎是解决我问题的唯一方法,检测到震动
奇怪的是,第一种方法没有正确加载视图,这是一个错误吗???ViewDidDisplay:(BOOL)仅当视图由UINavigationController或uitabarController显示时才会调用animated。如果将视图控制器的视图添加到子视图(例如滚动视图或其他)中,它不会被调用。你可能会认为它会被调用,但你错了。我只是被它咬了一口。关于@generirich的评论,你可以在自己将子视图放入后手动调用viewdide
[self.view addSubview:theViewController.view];
[theViewController viewDidAppear:FALSE];
这对我很有用。希望对其他人有所帮助。显示创建和显示BuildHouseViewController的代码(添加到问题中)。请参阅:根据UIResponder becomeFirstResponder的文档:您可以调用此方法以使响应者对象(如视图)成为第一响应者。但是,仅当该视图是视图层次结构的一部分时,才应在该视图上调用它。如果该视图的window属性包含UIWindow对象,则该对象已安装在视图层次结构中;如果返回nil,则该视图将从任何层次结构中分离。“因此,似乎它实际上应该使接收者成为第一反应者。