iPad App因方向改变而崩溃

时间:2013-02-14 15:42:43

标签: ios objective-c nsnotificationcenter device-orientation

我正在开发一款iPad应用。我同时允许横向和纵向模式。我的UI在纵向模式下很好,但当我将其更改为横向模式时,我的UI变得混乱。我看到了一些与此相关的SO帖子,我在initWith中添加了以下代码...在我的UIView中。

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(abc)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

执行此操作后,我的UI在纵向模式下正常工作。当我将其更改为横向模式时,我的用户界面很好。但在我将其更改回纵向模式后,我的应用程序崩溃了。我读了一些与应用程序崩溃相关的SO有关仪器的帖子。我启用了僵尸,发现正在向已发布的对象发送消息,此消息来自NSNotificationCenter。

除了注册我的设备外,还有什么我需要处理的吗?另外,有什么方法可以将实现从UIView更改为UIViewController并实现UIViewController有关设备方向的方法?请让我知道我需要遵循的步骤才能完成这项工作。谢谢!

2 个答案:

答案 0 :(得分:5)

您在哪里注册通知?当您即将更改方向时,您需要删除观察者(在prepForSegue或willAnimateRotationToInterfaceOrientation中,具体取决于您的设置),以防止消息传递不再有效的对象。如果您在viewDidAppear / viewWillAppear中注册,也不想堆积多个通知。

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

[[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

答案 1 :(得分:0)

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

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

使用这些方法比注册设备方向更改通知更常见。根据您关于崩溃的陈述,可能的问题是您永远不会删除您添加的观察者。对于addObserver的每次通话,都必须对removeObserver进行相应的调用。否则即使它已经消失,观察者也会被召唤。这会导致您描述的崩溃。