3

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

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

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

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

4

2 回答 2

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
于 2013-02-14T19:12:39.303 回答
0

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

您应该研究的一种方法是viewWillLayoutSubviews. 这是执行手动视图布局的常见位置。每当视图控制器的方向发生变化时都会调用它。

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

于 2013-02-14T15:55:18.330 回答