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(这会导致崩溃)。
这行得通,但我觉得这是处理此问题的一种蹩脚方法。一定有更好的办法....
在 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(这会导致崩溃)。
这行得通,但我觉得这是处理此问题的一种蹩脚方法。一定有更好的办法....