iPad应用程序在方向更改时崩溃。

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具有关于设备方向的方法?请告诉我需要遵循哪些步骤才能完成此操作。谢谢!

1
请发布堆栈跟踪。 - trojanfoe
我无法发布图片,因为我的声望低于10。 - user1982519
我不需要图片,只要文本就可以了(它应该出现在调试器窗格中)。 - trojanfoe
我更新了堆栈跟踪,请查看一下。 - user1982519
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

我在initWith...方法中注册了通知,因为我没有使用故事板,所以我没有prepForSeague,也没有willAnimateRotationToInterfaceOrientation,因为我正在实现UIView而不是UIViewController。我应该在哪里移除观察者? - user1982519
你没有将UIView嵌入到viewController中吗? - Tommy Devoy
不,我不是。我在dealloc方法中添加了这段代码,现在它运行得很好。谢谢。 - user1982519

0

UIViewController类有几个处理方向变化的方法。请参阅文档以了解这些方法的讨论。

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

使用这些方法比注册设备方向更改通知要常见得多。根据您关于崩溃的陈述,可能的问题是您从未删除添加的观察者。对于每次调用addObserver,必须有相应的removeObserver调用。否则,即使观察者已经消失很久,也会调用观察者。这导致了您所描述的崩溃。


现在我正在UIView中实现。如果没有其他处理UIView的方法,那么我计划在UIViewController中实现它。但是,我非常确定可以通过我采用的方法在UIView中实现这一点。我一定漏掉了什么。是否有其他方法在UIView中实现相同的功能?我将尝试使用removeObserver。 - user1982519

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接