Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone震动的问题:ViewDidIs';加载viewController时未调用_Iphone_Viewcontroller_Shake_Viewdidappear - Fatal编程技术网

iPhone震动的问题:ViewDidIs';加载viewController时未调用

iPhone震动的问题:ViewDidIs';加载viewController时未调用,iphone,viewcontroller,shake,viewdidappear,Iphone,Viewcontroller,Shake,Viewdidappear,我正在尝试检测iPhone设备上的震动,因此,就我所读到的内容而言,我需要将我的视图控制器设置为ViewDidAspect方法上的第一响应程序。本应自动调用此方法,但由于某些原因,从未调用此方法。仅调用viewDidLoad 这是我的代码(我只放了相关部分): BuildHouseViewController.h: @界面BuildHouseViewController:UIViewController{ BuildHouseViewController.m: - (void)viewDidLo

我正在尝试检测iPhone设备上的震动,因此,就我所读到的内容而言,我需要将我的视图控制器设置为ViewDidAspect方法上的第一响应程序。本应自动调用此方法,但由于某些原因,从未调用此方法。仅调用viewDidLoad

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

BuildHouseViewController.h:

@界面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];
}
我在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,则该视图将从任何层次结构中分离。“因此,似乎它实际上应该使接收者成为第一反应者。