2011-11-29 114 views
2

我需要一些幫助爲以下'問題'選擇'正確'的解決方案。防止視圖控制器被重置 - UINavcontroller + Storyboard + Segue的

我使用新的故事板功能將我的應用程序的所有屏幕鏈接在一起。基本結構能夠深入:

[導航控制器] => [視圖控制器#1] => [的TabBar控制器] => [視圖控制器#2] *

**(和一些其他標籤,其現在不重要)*

我已經從第一個視圖控制器(#1)附加了一個segue(推)到Tab Bar控制器後面的View Controller。當用戶按下第一個控制器上的某些東西並正常工作時,會觸發此推送。

// Execute preset segue 
[self performSegueWithIdentifier:@"segueEventDetail" sender:self]; 

當用戶(現在是在視圖控制器#2)按壓導航欄的返回按鈕用戶回到。假設他現在再次觸發segue,第二個視圖控制器再次顯示,但現在「重置」(空)。 (我相信在閱讀了幾個論壇和文章之後,這是使用segue時的標準行爲,因爲這些會破壞並重新啓動視圖控制器的每一次?)

由於第二個視圖的內容(視圖控制器被重置)控制器是動態的(取決於來自服務器的JSON響應),因此當用戶回來時視圖控制器保持完整(或恢復)是'需要的'。

我發現了幾個來源(見底部)描述相同的問題,但解決方案各不相同,我需要一些幫助選擇正確的問題。

綜述:

  • 我怎樣才能「保留」 /保存視圖控制器的狀態下,當用戶按下背部,同時保留使用故事板&最好也Segue公司的

自己的想法的:

#1我現在正在考慮將JSON響應緩存到我的單例類(並從那裏到PLIST)並在第二個查看控制器是否存在此數據,並重建視圖,然後檢查是否有新數據(恢復正常操作)。

#2我想到的另一個是'繞過'segue和手動處理視圖的切換,部分解釋(Storyboard - refer to ViewController in AppDelegate) - 這也有可能嗎?

但也許有一個更容易/更好的選擇?

http://www.iphonedevsdk.com/forum/iphone-sdk-development/93913-retaining-data-when-using-storyboards.html Storyboard - refer to ViewController in AppDelegate How to serialize a UIView?

+2

從[UITabBarController類參考](http://developer.apple.com/library/ios/#documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html)「部署標籤欄界面時,您必須安裝這個視圖作爲你的窗口的根目錄。與其他視圖控制器不同,一個標籤欄界面不應該被安裝爲另一個視圖控制器的子項。「無關緊要,但重要。 –

+0

我沒有意識到這一點!這與我的問題有關,因爲我在tabcontroller前面有另一個viewcontroller。 – YDL

回答

0

對於任何橫跨在未來,這(我的)的問題來了,這是我結束了「編碼」吧。

  • 打開故事板,並選擇你的「標籤欄控制器」,打開屬性檢查器

  • 填寫在該領域

  • 的「標識符」隨着第一個視圖控制器(見的場景在原來的職位)我創建一個全球參考的ViewController:

firstviewcontroller.h

@interface YourViewController : UIViewController { 

    UITabBarController *tabController; 

} 

firstviewcontroller.m

//Fill the reference to the tabcontroller using the identifier 
tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"]; 

我們從以下行可使用的firstviewcontroller切換:

[[self navigationController] pushViewController:tabController animated:YES]; 
+0

儘管這根本不使用Segues,但您正在逐漸回到程序化的做事風格。我很想看看你還能如何設法使用segues。 – sparkFinder

+0

哇...你幾乎引用@羅伯特 - 簡的答案,並不能讓他信任它。你做錯的唯一事情就是設置一個iVar而不是一個屬性setter/getter。 – chwi

+0

Wilhelmsen,在提出此類索賠前請檢查帖子的日期。我在4個月前發佈了代碼。 (02-12-2011 vs 10-03-2012)。 – YDL

2

耶士!!我得到了解決方案。執行以下操作:

在你的.h文件:

@property (strong, nonatomic) UITabBarController *tabController; 

在你.m文件:

@synthesize tabController; 

tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"]; 

選定的指標是你想要的標籤去

tabController.selectedIndex = 1; 

[[self navigationController] pushViewController:tabController animated:YES]; 
0

這可能是更簡單的解決方案(不使用屬性 - 事實上,所有的類實例並不需要知道他們的目的地控制器,所以只是將其保存爲靜態的推功能):

static UIVewController *destController = nil; 
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
if (!storyboard) { 
    DLog(Storyboard not found); 
    return; 
} 
if (destController == nil) { //first initialisation of destController 
    destController = [storyboard instantiateViewControllerWithIdentifier:@"{Your Destination controller identifyer}"]; 
    if(!destController) { 
     DLog(destController not found) 
     return; 
    } 
} 
//set any additional destController's properties; 
[self.navigationController pushViewController:destController animated:YES]; 

附: DLog只是我的變化NSLog

但是真的很有趣如何用segue做到這一點?

相關問題