[英]How to perform Unwind segue programmatically?
使用故事板這很容易。 您只需將操作拖到“退出”即可。 但是我應該如何從我的代碼中調用它?
插入 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 沒有觸發,您可能有一個保留周期。
我使用了[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)
}
所以這就是你所要做的!
對於那些想知道如何使用不是通過故事板設置的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 方法中,例如viewDidLoad或viewWillAppear ,它將被忽略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.