簡體   English   中英

如何以編程方式執行 Unwind segue?

[英]How to perform Unwind segue programmatically?

使用故事板這很容易。 您只需將操作拖到“退出”即可。 但是我應該如何從我的代碼中調用它?

  1. 創建一個手動轉場( ctrl -drag from File's Owner to Exit),
  2. 在綠色退出按鈕下方的左側控制器菜單中選擇它。

在綠色退出按鈕下方的左側控制器菜單中選擇它

插入 Segue 的名稱以展開。

然后, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender. 用你的 segue 標識。

這是 Objective C 和 Swift 的完整答案:

1) 在你的目標視圖控制器中創建一個IBAction unwind segue(你想要轉場的地方)。 實現文件中的任何位置。

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2)在源視圖控制器(您要從中分離的控制器)上,⌃ + 從“活動名稱”拖動以退出。 您應該會在彈出窗口中看到在步驟 1 中創建的 unwind segue。 (如果沒有看到,請查看第一步)。 從彈出窗口中選擇 unwindToContainerVC: 或任何您命名的方法,以將源控制器連接到 unwind IBAction。

在此處輸入圖片說明

3)在故事板的源視圖控制器的文檔大綱中選擇segue(它將在底部附近列出),並給它一個標識符

在此處輸入圖片說明

4) 使用此方法從視圖控制器調用 unwind segue,替換您的 unwind segue 名稱。

// 目標 C

[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];

// 斯威夫特

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

注意。 在 unwind 方法上使用 segue 參數的 sourceViewController 屬性來訪問源控制器上的任何公開屬性。 另外,請注意框架處理解除源控制器。 如果您想確認這一點,請向源控制器添加一個 dealloc 方法,其中包含一條日志消息,該消息在它被殺死后應觸發。 如果 dealloc 沒有觸發,您可能有一個保留周期。

bradleygriffith的回答很棒。 我采取了步驟 10 並制作了一個屏幕截圖以進行簡化。 這是 Xcode 6 中的屏幕截圖。

  1. 按住 Control 鍵從橙色圖標拖動到紅色退出圖標以在視圖中創建沒有任何操作/按鈕的放松。

在此處輸入圖片說明

  1. 然后在側邊欄中選擇unwind segue

在此處輸入圖片說明

  1. 設置 Segue 標識符字符串:

在此處輸入圖片說明

  1. 從代碼訪問該標識符:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];

我使用了[self dismissViewControllerAnimated: YES completion: nil]; 這將使您返回到調用ViewController

引用 Apple 關於 Unwind Segue 的技術說明中的文本:要添加只能以編程方式觸發的 unwind segue,請從場景的視圖控制器圖標控制+拖動到其退出圖標,然后從彈出菜單中為新 segue 選擇一個 unwind 操作。

鏈接到技術說明

Vishal Chaudhry 上面的回答對我有用。 我還要補充一點,以便使用以下方法手動觸發序列:

[self performSegueWithIdentifier:@"mySegueName" sender:self];

在 ViewController 中,您還必須在情節提要中的 ViewController 的場景下選擇展開轉場,並在 RHS 的屬性視圖中確保 Indentifier 字段包含您在代碼中引用的名稱(上例中的“mySegueName”) )。

如果省略此步驟,上面的行將拋出序列名稱未知的異常。

向后兼容的解決方案適用於 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;
        }
    }
}

快速 4

1.創建一個@IBAction ,在控制器中使用 segue 來解壓

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2.在情節提要中,從您要從 ctrl+drag 從控制器標志到退出標志並選擇您之前創建的方法的控制器上進行segue(展開):

在此處輸入圖片說明

3.現在你可以注意到在文檔大綱中你有一個標題為“Unwind segue....”的新行。 現在你應該點擊這一行並打開屬性檢查器來設置標識符(在我的例子中是unwindSegueIdentifier )。

在此處輸入圖片說明

4.你快完成了! 現在你需要打開你想要放松的視圖控制器並創建一些將執行轉場的方法。 例如,您可以添加按鈕,使用@IBAction將其與代碼連接,然后在此IBAction 中添加perfromSegue(withIdentifier:sender:)方法:

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

所以這就是你所要做的!

斯威夫特 4.2,Xcode 10+

對於那些想知道如何使用不是通過故事板設置的VC 來做到這一點的人(那些通過搜索“以編程方式”+“展開轉場”來解決這個問題的人)。

鑒於您無法以編程方式設置 unwind segue,最簡單的單獨編程解決方案是調用:

navigationController?.popToRootViewController(animated: true)

這會將堆棧上的所有視圖控制器彈出回您的根視圖控制器。


要從導航堆棧中彈出最頂層的視圖控制器,請使用:

navigationController?.popViewController(animated: true)

僅供參考:為了使@Vadim 的答案與從視圖控制器中調用的手動展開序列操作一起使用,您必須放置以下命令:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

在重寫類方法viewDidAppear內部,如下所示:

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

如果將它放在其他 ViewController 方法中,例如viewDidLoadviewWillAppear ,它將被忽略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM