1

我在這裏嘗試了很多答案,但沒有一個具有相同的確切場景。以編程方式返回到以前的ViewController在不同的故事板

我試圖導航到UIViewController,它位於另一個包中的單獨故事板內,到目前爲止我能夠導航到它,但無法返回到之前的UIViewController。調用該外部視圖控制器的方法(TabBarController)被實現爲如下:

+(void) launchExternalUI: (UIViewController *) previousViewController { 
    UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: [self frameworkBundle]]; 
    TabBarController *vc = (TabBarController*) [sb instantiateInitialViewController]; 
    [previousViewController.navigationController pushViewController:vc animated:YES]; 
    [vc release]; 
} 

現在內TabBarController的方法,該方法應返回到先前的視圖控制器:

- (void) navigateToPreviousViewController: (UIGestureRecognizer *)gesture { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

TabBarController,如果我打印所有我看到的self.navigationController中的視圖控制器都是TabBarController,我不應該看到前面的視圖控制器在launchExternalUI上推動了這個嗎? [self.navigationController popViewControllerAnimated:YES];根本沒有效果。我對此有點失落。

重要的是要注意previousViewController在本地故事板中定義,而TabBarController在不同的.framework中實現,是否會導致此問題?

在此先感謝您的幫助!

**編輯:導航流量我需要的是storyboard1:VC1->storyboard2:VC2->storyboard1:VC1,我能得到storyboard1:VC1->storyboard2:VC2一部分工作,但不是storyboard2:VC2->storyboard1:VC1

+0

launchExternalUI方法在哪個類中?什麼是previousViewController? – rdelmar 2014-09-19 20:03:21

+0

感謝您的評論,它是在.framework中的Utils類(NSObject)中定義的類方法。 – dorbsz 2014-09-19 21:04:47

回答

0

創建原始視圖控制器內的開卷SEGUE和使用塞格斯,而不是推/彈出將視圖控制器視圖添加到視圖數組。

要創建一個展開賽格瑞你應該在原來的ViewController創建的展開方法:

- (IBAction)unwindToOriginalViewControllerSegue:(UIStoryboardSegue*)sender { 
    ; //TODO: anything special you need, reference via sender 
} 

然後,在新的ViewController,在故事板,從控制器圖標,退出圖標拖動。鏈接到您在上面命名的Unwind segue。

+1

感謝您的答覆,這裏唯一的問題是,新的視圖控制器包含在一個.framework中,這意味着分佈在整個團隊中,以便集成到不同的項目中,並且應該要求最低限度的設置。我希望有一種更簡單的方法可以關閉當前的ViewController並返回到前一個ViewController,而不管它是如何構造的(真的錯過了Android的後退按鈕)。 – dorbsz 2014-09-19 18:30:21

+0

檢查一些基礎知識:你是否在每個故事板中爲你的視圖分配了一個名稱? – 2014-09-19 18:43:23

+0

原諒我,如果這太基本了。我已經犯了...... – 2014-09-19 18:51:24

3

我經常將項目拆分成各種故事板,並創建了一個動態視圖控制器,用於處理從輔助故事板加載相應控制器的任務,同時維護導航樹。

我創建了一個示例項目並上傳到github,因爲它比解釋這裏的所有步驟更簡單。要注意的關鍵部分是Main.stoyboard中每個DynamicStoryboardViewController的用戶定義運行時屬性。還要注意,每個次要故事板都需要爲你的一個viewControllers檢查「is initial View Controller」。不包含在該示例中的是從故事板加載特定的場景。這只不過是添加「sceneName」動態運行時屬性,與添加storyboardName屬性的方式大致相同。

這是一個快速示例,所以有點粗糙,但你會明白它是如何工作的。如果您遇到問題,請隨時提問。

乾杯!

編輯:

我漸漸明白,也許你沒有一個navigationController視圖層次結構(如我在我的樣本中做)。無論如何,看起來,你無法控制標籤欄的介紹位置。所以沒有navigationController [self.navigationController popViewControllerAnimated:YES]將不起作用;

你應該測試這個,或者像你一樣調用popViewControllerAnimated,或者調用dismissViewControllerAnimated;

if(self.navigationController){ 
     [self.navigationController popViewControllerAnimated:YES]; 
    }else{ 
     [self.presentingViewController dismissViewControllerAnimated:Yes completion:nil]; 
    } 

希望這有助於,如果沒有,也許你可以提供一些示例代碼。

+0

感謝您的回覆,我會嘗試一下。但是我不得不提及,如果沒有一些黑客行爲,沒有辦法做到這一點令人驚訝,我會假設我在我的項目中重複使用功能的方式(通過創建分離的.frameworks)完全錯誤,或者蘋果真的希望開發人員能夠複製粘貼,並通過保持重構故事板將所有內容放在一個故事板中來做一些重新工作。通過簡單的後退按鈕神奇地解決的東西必須在iOS中完全被黑客入侵。 – dorbsz 2014-09-19 22:07:14

+0

好的,根據我的理解,您在Main.storyboard上定義了一些動態故事板,並且您將它們從singleViewControllerSB和tabbarControllerSB中動態加載。就我而言,我不想在MainStoryBoard上定義我將鏈接到不同的故事板,我所需要做的就是以編程方式從不同的故事板啓動視圖控制器,並能夠返回到視圖控制器在我完成它之後調用它,這是不可能的? – dorbsz 2014-09-19 22:26:50

+0

不,我正在創建一個動態視圖控制器,傳遞我想要在運行時屬性中導航到的故事板的名稱。是的,這可能與我的示例一樣。 – MDB983 2014-09-19 22:44:36

0
UIViewController * YourViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Storyboard Identifier"]; 
[self.navigationController pushViewController:YourViewController animated:TRUE]; 
相關問題