我有一个包裹在导航控制器中的主屏幕。
主屏幕有几个按钮可触发其他视图的分段。一个按钮进入表格视图。
此表中的选择应触发通常由主视图上的一个按钮执行的segue。
我假设我需要首先放松到主屏幕,然后以编程方式从unwind segue触发segue,但是当我这样做时会发生的事情是它先执行编程segue,然后展开,然后结束再次在主屏幕上。
处理这种情况的正确方法是什么?我不想在以编程方式调用segue之后返回到表视图,然后返回按钮将转到主视图。
如果它有助于更多地解释我的用例:表视图是一个级别列表。选择应该使用表格视图中选择的级别启动我的游戏视图。
我在主视图中的解开:
<Loggers>
<Logger name="com.foo.Bar" level="trace">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
显然@IBAction func backFromLevelSelectionUnwindSegue(segue:UIStoryboardSegue) {
performSegueWithIdentifier("playSegue", sender: self)
}
是游戏视图控制器的一部分。
对类似问题的回答建议设置一个布尔标志,然后在viewDidAppear中执行segue,但看起来viewDidAppear不应该知道已经发生的展开segue。是否有一个我没有遇到的“正确”解决方案?
答案 0 :(得分:4)
在你的backFromLevelSelectionUnwindSegue中,你仍然处于一个放松的segue上下文中。因此,在完成上下文后,使用 dispatch_async 或 performSelector:withObject:afterDelay 调用performSegueWithIdentifier,如下所示。
@IBAction func
backFromLevelSelectionUnwindSegue( segue:UIStoryboardSegue ) {
dispatch_async( dispatch_get_main_queue() ) {
self.performSegueWithIdentifier( "playSegue", sender: self )
}
}
答案 1 :(得分:1)
您是否可以在不将其展开到主屏幕的情况下对游戏视图执行segue?然后当你展开segue时,将它展开到主视图而不是回到表格视图?如果我没记错的话,我们可以通过呈现视图控制器来解开。
答案 2 :(得分:1)
这是一个意见问题,但在你的情况下,我认为你应该只是在tableview和游戏之间有一个segue,任何额外的数据必须从主VC传递到tableview VC。
如果你需要在UINavigationVC中返回多个viewControllers,我会看一下使用popToRootViewController或者在它们之间使用unWind。例如使用第一个viewController
中的处理程序从第3个viewController调用unwind答案 3 :(得分:0)
可以有多个展开的细分可以回到不同的地方。在给定视图控制器的场景中,应该安排Main-&gt; LevelSelect-&gt; Game
然后当游戏结束时你有两个或3个展开细分的按钮。第一个是exitToGameStart
,允许玩家重新启动相同级别。 exitToLevelSelect
允许玩家选择新级别。并且可选地exitToMainMenu
一直回到起点。有关完整示例,请参阅Apple's UnwindSegue sample,特别是&#34;重新开始&#34;执行exitToQuizStart
展开segue和&#34;返回菜单屏幕的最后一个表上的按钮&#34;执行exitToHomeScreen
展开segue。接收方法的代码如下:
QuestionViewController.m
//! Unwinds from the ResultsViewController back to the first
//! QuestionViewController when the user taps the 'Start Over' button.
//
// This is an unwind action. Note that the sender parameter is a
// 'UIStoryboardSegue*' instead of the usual 'id'. Like all unwind actions,
// this method is invoked early in the unwind process, before the visual
// transition. Note that the receiver of this method is the
// destinationViewController of the segue. Your view controller should use
// this callback to update its UI before it is redisplayed.
//
- (IBAction)exitToQuizStart:(UIStoryboardSegue *)sender
{
// The user has restarted the quiz.
[self.currentQuiz resetQuiz];
}
MainMenuViewController.m
//! Unwinds from the ResultsViewController back to the MainMenuViewController
//! when the user taps the 'Return to the Home Screen' button.
//
// This is an unwind action. Note that the sender parameter is a
// 'UIStoryboardSegue*' instead of the usual 'id'. Like all unwind actions,
// this method is invoked early in the unwind process, before the visual
// transition. Note that the receiver of this method is the
// destinationViewController of the segue. Your view controller should use
// this callback to retrieve information from the sourceViewController. Used
// properly, this method can replace existing delegation techniques for
// passing information from a detail view controller to a previous view
// controller in the navigation hierarchy.
//
- (IBAction)exitToHomeScreen:(UIStoryboardSegue *)unwindSegue
{
// Retrieve the score from the ResultsViewController and update the high
// score.
ResultsViewController *resultVC = (ResultsViewController*)unwindSegue.sourceViewController;
self.highScore = MAX(resultVC.currentQuiz.percentageScore, self.highScore);
}
注意:要在最新的Xcode中构建旧项目,打开故事板,文件检查器,构建,选择较新的iOS版本。