Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.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
Ios iPad应用程序因方向改变而崩溃_Ios_Objective C_Nsnotificationcenter_Device Orientation - Fatal编程技术网

Ios iPad应用程序因方向改变而崩溃

Ios iPad应用程序因方向改变而崩溃,ios,objective-c,nsnotificationcenter,device-orientation,Ios,Objective C,Nsnotificationcenter,Device Orientation,我正在开发一款iPad应用程序。我允许横向和纵向模式。我的用户界面在纵向模式下很好,但当我将其更改为横向模式时,我的用户界面会变得一团糟。我看到一些与此相关的SO帖子,我在initWith中添加了以下代码。。。在我看来 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self

我正在开发一款iPad应用程序。我允许横向和纵向模式。我的用户界面在纵向模式下很好,但当我将其更改为横向模式时,我的用户界面会变得一团糟。我看到一些与此相关的SO帖子,我在initWith中添加了以下代码。。。在我看来

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(abc)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];
完成此操作后,我的UI在纵向模式下工作正常。当我将其更改为横向模式时,我的UI很好。但当我把它改回肖像模式后,我的应用程序崩溃了。我读了一些关于应用程序崩溃的帖子,了解了仪器。我启用了僵尸,发现一条消息正在发送到已经发布的对象,而这条消息来自NSNotificationCenter


除了注册我的设备,我还需要处理其他事情吗?此外,是否有任何方法可以将实现从UIView更改为UIViewController,并实现UIViewController关于设备方向的方法?请让我知道为了完成这项工作我需要遵循的步骤。谢谢

UIViewController类有几种处理方向变化的方法。有关这些方法的讨论,请参阅文档

您应该研究的一种方法是
viewWillLayoutSubviews
。这是执行手动视图布局的常见位置。只要视图控制器的方向发生更改,就会调用该选项


使用这些方法比注册设备方向更改通知更常见。根据您关于崩溃的陈述,一个可能的问题是您从未删除您添加的观察者。对于每个对
addObserver
的调用,必须有一个对
removeObserver
的相应调用。否则,即使观察者早已离开,也会被调用。这将导致您描述的崩溃。

您在哪里注册通知?当您准备更改方向时(在PrepforeSegue或WillAnimateRotationInterfaceOrientation中,具体取决于您的设置方式),您需要删除观察者,以防止向不再有效的对象发送消息。如果在ViewDidDisplay/ViewWillDisplay中注册,您也不希望堆积多个通知

使用以下方法移除观察者:

[[NSNotificationCenter defaultCenter] removeObserver:self];//removes all notifications for that object (the way I've used it before)
或者,如果您想说得具体一些,请执行以下操作:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice];//remove just that notification

请发布stacktrace。我无法发布图像,因为我的声誉低于10。我不想要图像;文本将很好(它应该出现在调试器窗格中)。我更新了堆栈跟踪。请看一下。现在我正在UIView中实现。如果在UIView中没有其他处理方法,那么我计划在UIViewController中实现它。但是,我非常确信,这可以通过我所遵循的方法在UIView中实现。我一定错过了什么。在UIView中是否有其他方法实现同样的功能?我将尝试删除Observer。我在initWith中注册了通知。。。方法,因为我没有使用故事板,也没有WillAnimateRotationInterfaceOrientation,因为我实现的是UIView而不是UIViewController。我应该在哪里删除observer?您没有将UIView嵌入到viewController中吗?没有。我在dealoc方法中添加了这段代码,现在它工作正常了。非常感谢。