2013-10-17 18 views
3

關於何時使用UIViewContoller與UIView有一些很好的答案。例如herehere應用程序結構:分頁界面中的UIView與UIViewController

的一般要點是,一個UIViewController應該用於控制數據的完整畫面,因爲

  1. 它被設計成手柄轉動。一次只能有一個UIViewController在屏幕上,因爲only the newest將被通知輪換髮生。

  2. 要保持對MVC範例的真實性,您的業務邏輯應該存在於UIViewController中,而只有顯示和交互邏輯應該存在於UIView中。推測商業邏輯與整個屏幕上的內容有關。

我的問題是,鑑於此,我該如何在幾個頂層視圖之間使用左右分頁來構造應用程序?

我想用幾個UITableViews創建一個接口,並保存一系列配方。用戶左右滑動以在列表之間導航。底部有一個共同的菜單,無論如何都保持固定。

我最初的想法是爲UIScrollView使用一個UIVIewController,然後從那裏添加子視圖。

但是我真的很喜歡每個列表都有它自己的UIViewController,所以它可以處理自己的旋轉,並保持業務邏輯像它自己的REST方法。讓頂層的UIViewController處理子視圖的旋轉似乎是一件痛苦的事情,而且將邏輯放在其他任何地方似乎違反了MVC。

有沒有一種方法來構建一個應用程序,以便多個UIViewControllers住在UIScrollView中,還是適合使用一系列頂級UIViewControllers和UISwipeGestureRecognizer來模擬UIScrollView的分頁效果?

謝謝。

回答

2

一對夫婦的想法:

  1. 如果定位的iOS 5及更高版本,我建議使用UIPageViewController這是專爲正是這個UI(刷卡在UIViewController實例之間來回)。然後,您將爲每個配方分別提供UIViewController。在iOS 5中,您只有UIPageViewControllerTransitionStylePageCurltransition style,但在iOS 6中,您也有UIPageViewControllerTransitionStyleScroll

    有關更多信息,請參閱適用於iOS的視圖控制器目錄的Page View Controller部分。

  2. 這比編寫自己的基於滾動視圖的解決方案簡單得多。如果使用UIScrollView「滾動自己」,則需要刪除滾動屏幕外的實例(通過註冊滾動視圖的delegate並響應scrollViewDidScroll),以免不必要地佔用內存。

    如果您確實將子視圖控制器添加到滾動視圖中,請不要忘記調用相應的custom container calls。特別是,當您添加視圖控制器到您的滾動視圖,請確保您撥打以下(假設controller是孩子控制器和self是主視圖控制器):

    [self addChildViewController:controller]; 
    [self.scrollView addSubview:controller.view]; 
    [controller didMoveToParentViewController:self]; 
    

    正如您迴應scrollViewDidScroll刪除視圖控制器不再可見,做相應的清除調用,如:

    [controller willMoveToParentViewController:nil]; 
    [controller.view removeFromSuperview]; 
    [self removeChildViewController:controller]; 
    

    有關爲何調用這些定製容器調用是很重要的信息,請參閱WWDC 2011的視頻Implementing UIViewController Containment

  3. 但是,我絕對不會推薦使用UINavigationController,因爲它會將所有以前的頁面保留在內存中。

1

我相信你所說的要求你可以使用UINavigationController。它會給你你想要的「左右」分頁,你可以爲你的每個食譜使用UIViewController

此外,我認爲你想使用UIScrollView,因爲它可以讓你執行一個「滑動」手勢。如果是這種情況,您還可以將UISwipeGestureRecognizer添加到您的視圖控制器,每次識別該手勢時,請致電pushViewController:animated:popViewControllerAnimated:在您的配方之間執行導航。

這只是和想法。

希望這會有所幫助!

1

據我看到的,有2點不錯的選擇:

  1. 使用根的UINavigationController和推/彈出子 ViewControllers取決於輕掃手勢 的方向(由UISwipeGestureRecognizer認可,就像你說)。

  2. 使用帶有UIScrollView的根UIViewController並將子視圖控制器視圖添加爲scrollview子視圖。爲了處理 方向的變化,你可以通過方向變化 的UIViewController方法(willRotateToInterfaceOrientationdidRotateFromInterfaceOrientation)孩子控制器,所以他們 能夠處理它們。

我希望我幫助

+0

謝謝,直接傳遞orientation-change方法的好主意 – bcattle

+0

@bcattle如果你調用適當的[容器視圖控制器方法](https://developer.apple.com/library/ios/documentation/uikit/reference/ UIViewController_Class/Reference/Reference.html#// apple_ref/doc/uid/TP40006926-CH3-SW81),您不必手動傳遞這些旋轉方法。它們會自動被傳遞(這是實現容器的許多原因之一)。您可以_can_,如果需要,通過返回'NO'來響應'shouldAutorotateToInterfaceOrientation',但禁用該行爲,但默認情況下,容器會自動將這些旋轉事件傳遞給其子項。 – Rob

1

首先,您應該知道,自iOS 5以來,可以在您的主視圖控制器中包含子視圖控制器。

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

所以,在我看來,一個不錯的選擇將有一個分頁的UIScrollView作爲主控制器,然後把你的孩子控制器的情況下,在每個頁面。因爲這可能都有一點內存密集,你應該在任何時候只有三個實例(一個正在顯示,一個是任何一方,以便他們如果用戶開始滾動就準備好了)。蘋果示範項目展示瞭如何配置一個滾動視圖這樣的:

https://developer.apple.com/library/ios/samplecode/PageControl/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007795

希望有所幫助。