2013-02-14 47 views
3

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

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

这样做后,我的用户界面在纵向模式下工作正常。当我将其更改为横向模式时,我的UI很好。但是在我将其更改回肖像模式后,我的应用程序崩溃。我阅读了一些与应用程序崩溃有关的文章,并了解了有关文书。我启用僵尸并发现消息正在发送到已发布的对象,并且此消息来自NSNotificationCenter。

除注册我的设备外,还有其他需要处理的东西吗?此外,有没有什么办法可以将实现从UIView更改为UIViewController,并实现UIViewController关于设备方向的方法?请让我知道我需要遵循的步骤,以完成此任务。谢谢!

+1

请张贴堆栈跟踪。 – trojanfoe 2013-02-14 15:48:20

+0

我无法发布图片,因为我的声望低于10. – user1982519 2013-02-14 16:26:02

+0

我不想要图片;文本会很好(它应该出现在调试器窗格中)。 – trojanfoe 2013-02-14 16:36:43

回答

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 
+0

我在initWith ...方法中注册了通知,我没有prepForSeague,因为我没有使用故事板,也没有willAnimateRotationToInterfaceOrientation,因为我正在实现UIView而不是UIViewController。我应该在哪里删除观察者? – user1982519 2013-02-14 19:37:34

+0

你是不是将UIView嵌入到viewController中? – 2013-02-14 20:46:50

+0

不,我不是。我在dealloc方法中添加了这段代码,现在它工作的很好。谢谢。 – user1982519 2013-02-14 22:35:03

0

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

你应该看看的一种方法是viewWillLayoutSubviews。这是执行手动视图布局的常用位置。这在视图控制器的方向发生变化时被调用。

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

+0

现在我正在UIView中实现。如果在UIView中没有其他方式处理它,那么我打算在UIViewController中实现它。但是,我非常肯定,这可以通过我遵循的方法在UIView中实现。我肯定错过了什么。有没有其他的方式来实现在UIView相同?我将尝试删除Observer。 – user1982519 2013-02-14 16:13:19