Ios 如何以编程方式执行展开顺序?

Ios 如何以编程方式执行展开顺序?,ios,segue,ios6,Ios,Segue,Ios6,使用故事板这是非常容易的。您只需将操作拖动到“退出”。但是我应该如何从代码中调用它呢 创建一个手动序列(按ctrl键从文件所有者拖动以退出) 在绿色退出按钮下方的左侧控制器菜单中选择它 插入要展开的段的名称 然后,-(void)performsguewithidentifier:(NSString*)identifier sender:(id)sender。与您的segue标识一起。我使用了[自我解除视图控制器激活:是完成:否]将返回调用的视图控制器供参考:为了使@Vadim的回答能够使用从视

使用故事板这是非常容易的。您只需将操作拖动到“退出”。但是我应该如何从代码中调用它呢

  • 创建一个手动序列(按ctrl键从文件所有者拖动以退出)
  • 在绿色退出按钮下方的左侧控制器菜单中选择它
  • 插入要展开的段的名称


    然后,
    -(void)performsguewithidentifier:(NSString*)identifier sender:(id)sender。
    与您的segue标识一起。

    我使用了
    [自我解除视图控制器激活:是完成:否]
    将返回调用的
    视图控制器

    供参考:为了使@Vadim的回答能够使用从视图控制器中调用的手动展开顺序操作,您必须放置以下命令:

    [self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
    
    在被重写的类方法中,ViewDid出现如下情况:

    -(void) viewDidAppear:(BOOL) animated
    {
        [super viewDidAppear: animated];
    
        [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
    }
    

    如果您将它放在其他ViewController方法中,如viewDidLoadViewWillDisplay,它将被忽略。

    引用苹果公司关于展开顺序的技术说明: 要添加仅以编程方式触发的展开序列,请control+从场景的“视图控制器”图标拖动到其“退出”图标,然后从弹出菜单中选择新序列的展开操作


    向后兼容的解决方案,适用于ios6之前的版本,适用于感兴趣的用户:

    - (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {
    
        for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
            UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
            if ([vc isKindOfClass:vcClass]) {
                [self.navigationController popToViewController:vc animated:animated];
                return;
            }
        }
    }
    

    上面Vishal Chaudhry的回答对我有用。我还要补充一点,为了手动触发顺序,请使用:

    [self performSegueWithIdentifier:@"mySegueName" sender:self];
    
    在ViewController中,您还必须在情节提要和RHS上的属性视图中选择ViewController场景下的展开序列,确保标识符字段包含代码中引用的名称(“上面示例中的mySegueName”)


    如果省略此步骤,上面的一行将抛出一个异常,即序列名称未知。

    bradleygriffith
    的答案非常好。我采取了第10步,并做了一个简化的屏幕截图。这是Xcode 6中的屏幕截图

  • 控件从橙色图标拖动到红色退出图标,以在视图中创建无任何操作/按钮的展开
  • 然后在侧边栏中选择
    展开序列
  • 设置序列标识符字符串:
  • 从代码中访问该标识符:

  • 以下是目标C和Swift的完整答案:

    1) 在目标视图控制器(您要转到的位置)中创建一个
    iAction
    unwind segue。实现文件中的任意位置

    // Objective C
    
        - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
    
        }
    
    // Swift
    
     @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
    
        }
    
    2) 在源代码视图控制器(从中分离的控制器)上,⌃ + 从“活动名称”拖动以退出。您应该在弹出窗口中看到在步骤1中创建的展开序列。(如果看不到,请回顾第一步)。从弹出窗口中选择unwindToContainerVC:或任何您命名的方法,以将源控制器连接到unwind IBAction

    3) 在序列图像板的源代码视图控制器的文档大纲中选择序列(它将在底部附近列出),并为其指定一个标识符

    4) 使用此方法从源代码视图控制器调用展开序列,替换展开序列名称

    //目标C

    [self-PerformsgueWithIdentifier:@“unwindToContainerVC”发送方:self]

    //迅捷的

    self.performsguewithidentifier(“unwindToContainerVC”,发件人:self)


    注意。使用unwind方法上segue参数的sourceViewController属性访问源控制器上的任何公开属性。另外,请注意,该框架处理解除源代码控制器。如果您想确认这一点,请向源控制器添加一个dealloc方法,该方法带有一条日志消息,一旦终止就会触发。如果dealloc未触发,您可能有一个保留周期。

    SWIFT 4

    1。创建一个@iAction,在控制器内部设置一个segue,以便将其释放到:

        @IBAction func unwindToVC(segue: UIStoryboardSegue) {
    
        }
    
    2.在情节提要中,从要从ctrl中分离(展开)的控制器,然后从控制器符号拖动到退出符号,并选择先前创建的方法:

    3.现在您可以注意到,在文档大纲中,有一行标题为“Unwind segue…”的新行。现在,您应该单击此行并打开属性检查器来设置标识符(在我的例子中是unwindSegueIdentifier

    4.你差不多完成了!现在,您需要打开希望从中展开的视图控制器,并创建一些执行segue的方法。例如,您可以添加按钮,将其与带有@IBAction的代码连接,然后在此IBAction内添加perfromSegue(带标识符:发送者:)方法:

         @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
             performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
         }
    
    这就是你要做的一切

    Swift 4.2,Xcode 10+ 对于那些想知道如何使用未通过故事板设置的VCs执行此操作的人(那些通过搜索“编程”+“释放序列”来回答此问题的人)

    鉴于您无法通过编程方式设置展开序列,最简单的单独编程解决方案是调用:

    navigationController?.popToRootViewController(动画:true)

    这会将堆栈上的所有视图控制器弹出回根视图控制器


    要仅从导航堆栈中弹出最顶部的视图控制器,请使用:


    navigationController?.popViewController(动画:true)

    我发现这是一个有效的问题——我自己也有。您可以通过1以编程方式执行展开序列。创建手动序列(ctrl从文件所有者拖动以退出),2。在IB中给它命名,然后是3。在您的代码中使用标识符:发件人:执行正常-性能测试。IMO不应关闭此问题。投票关闭此问题的用户似乎没有Obj-C/Cocoa Touch背景。Yang:如何命名?我只使用[self dismissViewControllerAnimate]
         @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
             performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
         }