iOS 7.1 设置变量前的嵌入式 Segue 转换

iOS 7.1 Embedded Segue Transitions Before Setting Variables

在 iOS 7.1 而不是 8.x 下出现的非常奇怪的问题。

我有一个 viewcontroller 与一个容器连接到第二个 viewcontroller。该容器具有到表 viewcontroller 的嵌入式转场。

VC1 在 prepareForSegue

中执行以下操作
self.popController = [(UIStoryboardPopoverSegue *)segue popoverController];
        MyChannelUpdateContainVC *myChannelUpdateVC = (MyChannelUpdateContainVC *)self.popController.contentViewController;
        myChannelUpdateVC._delegate = self;
        myChannelUpdateVC.isNewChannel = YES;

VC2 使用容器视图在 prepareForSegue 中执行以下操作。这是一个嵌入式转场。

MyChannelUpdateTVC *vc = [segue destinationViewController];
vc.isNewChannel = self.isNewChannel;
vc.channelIDStr = self.channelIDStr;
vc.channelNameStr = self.channelNameStr;

问题是,仅在 iOS7 下,最终表viewcontroller 没有按设置接收这些变量。我在 VC2 中放置了显示变量的断点,在执行 prepareForSegue 时未设置。但是,iOS 8.x 下的 运行 和我发现它们设置在同一断点处。

我可以在两个 iOS 版本中看到 VC2(嵌入式转场)中的 prepareForSegue 实际上甚至在 viewDidLoad 之前执行 iOS ] 7 与 iOS 8 不同,在触发嵌入式转场时,它还没有收到来自前一个转场的变量。在 iOS 7 下如何解决这个问题?

更新:更加陌生----

逐步执行此操作会发生以下情况:

1/ 在 VC1 中执行以下操作:self.popController = [(UIStoryboardPopoverSegue *)segue popoverController];

2/ 然后它并没有执行下面的其他代码,而是立即转到 VC2 并开始执行 VC 的 preapreForSegue

3/ 然后 returns 到第 1 步完成这些命令。

那么为什么 iOS7.1 在完成 VC1 的 prepareForSegue 中的命令之前执行第二个 VC?!?

我用我认为是 hack 的方法解决了这个问题,所以如果有更好的方法请提出。

问题在于,在 iOS7 下,执行 self.popController = [(UIStoryboardPopoverSegue *)segue popoverController]; 的行为会创建立即执行嵌入式转场的 XIB。嵌入式 segue 甚至在 viewDidLoad 之前执行。因此,在 iOS7 中,嵌入的 segue 在前一个控制器的 prepareForSegue 完成之前执行。这不会发生在 iOS 8.

为了在我的容器视图中解决这个问题,我执行了以下操作:

-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if (self._delegate)
    {
        _stoppedSegue = NO;
        return YES;
    }
    else
    {
        _stoppedSegue = YES;
        return NO;
    }

}

上面查看了我从前一个 VC 传递的变量,如果它发现它为 nill(这永远不应该)那么我知道我们是 运行 iOS 7.x 然后我停止了 segue。在 iOS8 中,变量将在那里并准备就绪,所以我就让它继续吧。

viewDidLoad 中,我执行以下操作:

if (_stoppedSegue)
        [self performSegueWithIdentifier:@"embeddedSegue" sender:self];

因此,如果它发现我们停止了 segue 执行,因为它 运行 在 iOS7 中太早了,它现在运行 segue,因为此时 VC 中的 prepareForSegue ]1实际上已经完成了。如果我们在 iOS8 下,它会发现我们没有停止进程,因此它不会再次执行 segue(这会导致崩溃)。

这行得通,但我觉得这是处理此问题的一种蹩脚方法。一定有更好的办法....