展开后执行segue

时间:2016-04-08 04:19:32

标签: xcode swift interface-builder

我有一个包裹在导航控制器中的主屏幕。

主屏幕有几个按钮可触发其他视图的分段。一个按钮进入表格视图。

此表中的选择应触发通常由主视图上的一个按钮执行的segue。

我假设我需要首先放松到主屏幕,然后以编程方式从unwind segue触发segue,但是当我这样做时会发生的事情是它先执行编程segue,然后展开,然后结束再次在主屏幕上。

处理这种情况的正确方法是什么?我不想在以编程方式调用segue之后返回到表视图,然后返回按钮将转到主视图。

如果它有助于更​​多地解释我的用例:表视图是一个级别列表。选择应该使用表格视图中选择的级别启动我的游戏视图。

enter image description here

我在主视图中的解开:

<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。是否有一个我没有遇到的“正确”解决方案?

4 个答案:

答案 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版本。

UnwindSegue Storyboard