0

我使用两个 ViewController。一个 MainView 和一个 FlipViewController。MainView 包含一堆按钮和控件,以及一个图形显示,而 FlipView 包含设置。

MainView 根据方向加载不同的 XIB,以方便我支持的各种按钮和图形屏幕。这允许极大的灵活性以不同的方式布置事物。该项目最初是在 StoryBoarding 功能添加到 Xcode 之前创建的。

正常的用例是我在 MainView 上以纵向模式开始,然后触摸一个按钮,将 FlipView 旋转到视图中。我在 FlipView 上进行操作(配置程序的各个方面),然后提交更改,这会将我转回 MainVIew。到目前为止一切都很好。

当我进入 FlipView 然后旋转设备以使 FlipView 采用不同的方向时,就会出现问题。假设我将肖像旋转到横向。然后从 FlipView 返回到 MainView。此时,MainView 并不知道 FlipView 执行的 Rotation。所以它仍然用 Portrait XIB 显示 MainView。

从 FlipViewController 返回后,MainView 的 willRotateToInterfaceOrientation 永远不会被调用。因此,它永远不会发现方向变化,因此,为该方向保留了不正确的 XIB。这是 willRotateToInterfaceOrientation 中的方向处理程序的示例...

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration    {

// if portrait, load the portrait XIB for Pad or Phone

if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {

    if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

        [[NSBundle mainBundle] loadNibNamed:@"MainViewiPad" owner:self options:nil];

    }else{

        [[NSBundle mainBundle] loadNibNamed:@"MainView" owner:self options:nil];

    }

    [self viewDidLoad];

    intorient = 1;
 else.... handle Landscape...

所以我一直在尝试 viewWillAppear 例程,试图找到让 MainView 发现旋转并以系统方式执行它的方法。但到目前为止,我不知道如何使系统以这种方式工作。我怀疑当调用 viewWillAppear 时,我必须生成强制重新加载正确方向的代码。但这不能正常工作,因为我似乎从来没有及时加载更改,并且尝试从 viewWillAppear 消息中重新加载新的 XIB 似乎是不正确的。

非常感谢任何有助于理解这种行为的帮助。

4

1 回答 1

0

好的。我在这里找到了问题。问题是有关旋转的信息没有被发送回 MainView。这很容易通过让 FlipView(将对这些方向消息做出反应)将消息重新发送到 MainView 来处理。我在 FLipView 中的代码之前没有为旋转消息做任何事情(它是自动处理旋转),但现在我在 FlipView 中添加处理程序,如下所示:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
        [mainView willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
}

这实质上是将消息传递回MainView。这是因为在打开 FlipView 时 MainView 不会消失。它留在后面,仍然可以响应它收到的消息。

需要注意的一件事是,我在上面的代码中引用了 mainView。您需要在 FlipView alloc-init 之后将其传入,以确保您可以在需要时进行此调用。这意味着在 Flipview 代码中向 MainView 类添加一个新属性。

在打开 FlipView 之前,我在 MainView 中做了这样的事情:

FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];


controller.delegate = self;
controller.mainView = self;
controller.lastIndexPath = lastIndex;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];

希望这可以帮助其他遇到此类麻烦的人。当我以模态方式打开 Web 查看器时,我也注意到了同样的行为。我在那里使用相同的技术来处理相同类型的问题。

于 2013-01-24T17:06:21.657 回答