自动旋转后将消息发送到子视图

时间:2010-09-09 11:16:27

标签: iphone objective-c cocoa-touch ipad uikit

我的iPad应用程序中有一个相当简单的视图层次结构。

窗口 - > RootView - > TableView / DetailView

TableView和DetailView是作为子视图添加的兄弟姐妹(根据上一个问题的解决方案)。 在发布时,TableView就在前面。当你选择一个单元格时,会调用app delegate中的方法,将它们交换出来,将DetailView放在前面。 DetailView中的关闭按钮反过来。

效果很好。

...然而 DetailView包含一个在.xib中绘制的UIScrollView 当DetailView到达前面时,我有一个方法可以接收选择触发更改的单元格内容的详细信息。这将使用标签内容和图像填充详细信息视图。 标签是IBOutlet到.xib中标签的简单设置器 图像大小调整为UIScrollView的高度,保持纵横比。这是以编程方式完成的,将其添加到添加到UIScrollView的UIImageView。

我对肖像的行为很好。 当它旋转到横向时,我希望调整图像的大小以匹配封闭的UIImageView的 width (以及随后的封闭UIScrollView)。 我有一些很棒的代码来实际调整图像大小(由[链接文本] [1]

提供UIImage的类别添加

问题...... 只有RootViewController响应对didRotateToInterfaceOrientation的调用。 我需要将一条消息发送到DetailViews控制器上的方法,告诉它调整图像大小,然后重绘相关的UIImageView。 引用子视图的控制器似乎应该很简单,可能我错过了一个简单的答案。 我试着用:

[[self.view.subviews objectAtIndex:1] didRotateFromInterfaceOrientation:fromInterfaceOrientation];

[self.view viewWithTag:[[self.view.subviews objectAtIndex:1] tag]]

但他们都返回视图而不是视图控制器,因此当我尝试运行它时会对选择器产生所有的愤怒。

有人能指出正确的方法吗?

2 个答案:

答案 0 :(得分:1)

叹息。似乎写出这个问题的过程帮助我在脑海中更好地表达了它并找到答案......

引用已与视图控制器建立连接的Application Delegate ...

[[(AppDelegate *)[[UIApplication sharedApplication] delegate] detailViewController] methodToCall];

答案 1 :(得分:0)

所有视图控制器上调用旋转方法的最佳方法是使用Apple提供的Root View Controller并通过这些控制器显示任何子视图。这些包括UINavigationController,UITabBarController和iPad UISplitViewController。

导航事件只会被发送到根视图控制器,即应用程序主UIWindow中视图的视图控制器。这没有记录,但可以通过一些工作推断出来。 Apple的根视图控制器似乎能够传播旋转事件。

这可以手动实现(即没有Apple RVC),但需要跟踪所有孩子的VC并在某些只读属性上使用KVC,这可能会让你被踢出应用程序商店。

在您的情况下,可以使用导航控制器,隐藏导航栏和工具栏。使用当前的根视图控制器对其进行初始化,并将导航控制器视图添加到窗口,而不是当前的根视图控制器。当您需要显示详细信息时,只需按下导航堆栈上的详细信息即可。如果您不喜欢默认动画,可以通过一些工作来应用自己的过渡。

有关导航控制器的详细信息,请参见下文。

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html