簡體   English   中英

在 UITabBar 選項卡的視圖之間傳遞一個 UIViewController/UIView

[英]Pass a UIViewController/UIView between the views of UITabBar tabs

最終,我想知道如何從一個視圖 controller 存儲 UIView(全局,如有必要),以便可以在另一個視圖 Z594C103F2C6E04C3CD8AB0?

我已經構建了一個應用程序,它有一個主頁選項卡和一個指南選項卡作為兩個主要選項卡,但指南選項卡的功能有點獨特,因為它是一個動態選項卡,理想情況下會根據“指南”的內容顯示不同的內容從主頁選項卡中選擇。 因此,在 Home 選項卡上,有幾個 UIButtons 用於加載給定的指南。 每個指南只是用戶可以與之交互的一組圖像。 那里沒問題。

現在,在主頁選項卡上,當用戶選擇他們想要查看的指南時,我想使用 CurlDown 動畫過渡在主頁選項卡和指南選項卡之間進行轉換。 這是我唯一擁有 UIView 過渡動畫的地方——這意味着用戶的正常選項卡切換將是標准的無效果即時過渡。

以下是當用戶從“主頁”選項卡中選擇指南時,我如何實現“主頁到指南”的轉換。 這是在 HomeViewController 中完成的,作為分配給所有加載指南的 UIButtons 的 IBAction,每個按鈕都有一個唯一的標簽,告訴 GuideViewController 加載哪個指南:

- (IBAction)loadGuide:(id)sender
{
UIButton *button = (UIButton*) sender;
GuideViewController *guideController = [[GuideViewController alloc] initWithNibName:@"GuideViewController" bundle:nil];
self.guideViewController = guideController;
[self.guideViewController activateGuide:button.tag];
[UIView transitionFromView:self.view
                    toView:guideController.view
                  duration:1.0
                   options:UIViewAnimationOptionTransitionCurlDown
                completion:^(BOOL finished){
                    UITabBarItem *tabBarGuide = [[self.tabBarController.tabBar items] objectAtIndex:1];
                    [tabBarGuide setEnabled:TRUE];
                    self.tabBarController.selectedIndex = 1;
                }];
[guideController release];
}
// End (IBAction)loadGuide

這非常有效,直到我必須啟用“指南”選項卡並切換到它為止。 此時發生的情況似乎是創建了 GuideViewController 的另一個實例,並替換了最初實例化並從 HomeViewController 轉換到的實例,如上所示。

所以我想也許我可以通過將指南加載移動到新視圖來解決它,在該視圖上不與 UITabBar 一起使用,然后從“主頁”選項卡加載並轉換到該視圖,就像我在上面的代碼。 然后,在切換選項卡后,我需要以某種方式將其作為子視圖等召回到我的指南選項卡的視圖 controller 中。

我認為在選項卡切換過程之后視圖仍然存在於 memory 中,我只是不知道如何訪問它,所以我可以在指南選項卡的視圖隱藏它之后再次顯示它。 我是否應該將視圖分配給 HomeViewController 中的某種全局可訪問變量,以便我可以從 GuideViewController(指南選項卡的視圖)訪問它?

我也願意接受任何替代建議,如果您認為這種方法不好,我最初嘗試通過將活動指南的詳細信息加載到數據庫中來解決問題。 然后在“指南”選項卡的視圖 controller 啟動時恢復該數據,但是,“指南”選項卡的視圖必須被緩存或其他東西,因為如果用戶返回主頁並選擇新指南,它將動畫過渡到該指南,但是當 Home-to-Guide-tab-switch 啟動時。它會翻轉回相同的 state,在用戶返回主頁選擇新選項卡之前,指南選項卡的視圖所在的位置,此外,我注意到ViewDidLoad 方法不會在手動或以編程方式切換選項卡時再次被調用,所以我認為另一個視圖必須仍然存在於 memory 中,(“其他視圖”是從 Home 啟動的 GuideViewController 視圖的原始實例選擇指南按鈕時的選項卡。或前面提到的新視圖,它基本上會做同樣的事情,盡管在一個單獨的類中。)

所以總結一下:

  • 我有兩個標簽,主頁和指南
  • Home 有幾個 UIButtons,點擊后會加載特定的指南
  • 當點擊 Home 上的 UIButton 時,它會從 Home 選項卡的視圖轉換到 Guide 選項卡的視圖 CurlDown,而無需先切換到 Guide 選項卡,因為那樣會失去 CurlDown 效果
  • 然后我必須以編程方式觸發選項卡切換,這似乎加載了 Guide 視圖的新實例,它有效地覆蓋了另一個實例
  • 我想知道我是否可以通過某種方式將另一個實例存儲為全局或其他實例來調用第一個實例?
  • Hense 關於如何在幾個 UIViewControllers 周圍傳遞 UIView 實例的問題

如果我是你,我會像往常一樣放棄過渡,只放棄標簽欄。

首先,因為它給您帶來了問題,但更重要的是,對於習慣於在您按下選項卡時切換選項卡欄的最終用戶來說,這似乎很奇怪(對我來說是這樣)。

我也會在標簽欄上閱讀並重新閱讀 Apple 的 HIG。 我認為您的用戶會發現標簽欄按鈕以外的其他東西會導致所選標簽切換非常令人困惑。

您將擁有 model 中的數據。 主頁選項卡將向 model 指定選擇哪個指南。 該指南會在每次出現時查看加載它的數據。

如果您確實需要保持過渡,請放棄指南選項卡並使用主頁選項卡內的導航欄。 您提到屏幕空間是不這樣做的一個問題,但是您可以讓導航欄出現但不可見。 然后,您可以在指南選項卡中使用一個按鈕來關閉該視圖控制器(彈出指南 vc)。

另一種選擇可能是以模態方式呈現指南視圖 - 但部分頁面 curl 也會稍微限制屏幕空間。

執行此操作的理想方法是將UIView object 的保留引用存儲在持久的 object 中,例如應用程序委托子類UIApplicationDelegate 然后應用程序委托可以實例化視圖。 然后,每個需要顯示視圖的 controller 只需向應用程序委托請求視圖。 此外,如果根視圖 controller 始終可用,它也可以保留在那里。

暫無
暫無

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

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