【问题标题】:iOS 7.1 Embedded Segue Transitions Before Setting Variables设置变量前的 iOS 7.1 嵌入式 Segue 转换
【发布时间】:2015-01-13 10:52:19
【问题描述】:

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

我有一个视图控制器,它使用容器连接到第二个视图控制器。该容器有一个嵌入到 tableviewcontroller 的 segue。

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 下,最终的 tableviewcontroller 没有接收到这些变量。我在 VC2 中放置了显示变量的断点,在执行 prepareForSegue 时没有设置。但是,在 iOS 8.x 下运行,我发现它们设置在同一个断点处。

我可以在两个 iOS 版本中看到,VC2(嵌入式 segue)中的 prepareForSegue 实际上是在 viewDidLoad 之前执行的来自上一个 segue 的变量。如何在 iOS 7 下解决此问题?

更新:更加陌生----

逐步完成以下操作:

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

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

3/ 然后返回步骤 1 完成这些命令。

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

【问题讨论】:

    标签: ios objective-c uiviewcontroller segue


    【解决方案1】:

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

    问题在于,在 iOS7 下,执行 self.popController = [(UIStoryboardPopoverSegue *)segue popoverController]; 的行为会创建立即执行嵌入式 segue 的 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 传递的一个变量,如果它发现它为零(这绝不应该是),那么我知道我们正在运行 iOS 7.x 并且我停止了转场。在 iOS8 中,变量会在那里并准备好,所以我让它继续。

    viewDidLoad 我执行以下操作:

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

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

    这可行,但我觉得处理这个问题的方法很蹩脚。一定有更好的办法....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      相关资源
      最近更新 更多