2013-03-10 57 views
4

我對iOS開發相對比較陌生,正在規劃一個應用程序。該應用程序將有幾個不同的場景/ ViewControllers將佔據整個屏幕。什麼是使視圖覆蓋應用程序中所有其他viewController的正確方法?

我打算總是在屏幕左上角有一個小按鈕,讓用戶回到主頁,無論哪個vc當前顯示。

我可以在每個viewController的視圖中放置一個單獨但相同的按鈕,但這看起來不夠雅觀和脆弱。

在閱讀視圖控制器編程指南後,我的直覺是創建一個視圖控制器容器,它將成爲根vc - 這個vc將有兩個子vcs - 一個帶有home按鈕,另一個帶有其他所有其他的VC的進入(實際上成爲新的根vc)

這對於更有經驗的iOS開發人員來說是否是一個合理的解決方案?有一個更簡單的解決方案嗎?

謝謝收到任何建議。

+1

這是最明智的。我就是這樣做的。 – Jeremy 2013-03-10 20:33:17

+0

謝謝。很高興知道我在理念上走在正確的軌道上。 – Diggory 2013-03-10 21:46:27

回答

1

我認爲這可能是您的最佳解決方案。在iOS中,ViewController將佔用所有可用空間來查看它。如果沒有您自己管理的「容器」視圖,您提供的任何視圖控制器都將佔據整個窗口,涵蓋您展示的任何內容。

但是,有一種替代方法可能更簡單,這取決於您的項目。

你可以在一些中心位置(比如你的App Delegate類)創建一個UIView對象(你的按鈕)。這一觀點可以有一個附加到一個方法的按鈕:

@implementation AppDelegate 

- (void) someSetupMethod { 
    UIButton* b = [UIButton buttonWithType:UIButtonTypeCustom]; 
    // setup whatever properties 

    // Now set button to call a method *on this AppDelegate object* ("self"): 
    [b addTarget:self action:@selector(homeButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; 

    // Store the button definition somewhere permanant 
    self.reusableHomeButton = b; 
} 

- (void) homeButtonTapped:(id)sender { 
    // do something to pop view controllers back to what you want. 
} 

然後,在您的視圖控制器,他們可能都顯示主頁按鈕,當他們出現:

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; 
    [self.view addSubview:appDelegate.reusableHomeButton]; 
} 

這需要的優勢[view addSubview:...]這是故意的副作用,即如果視圖已經在某些父項中,則首先將其從該父項中移除,然後添加到新視圖。

它還利用了一個事實,即一個按鈕可以將其消息發送到任何對象。它不一定是ViewController按鈕的父視圖。

這會導致您的按鈕在顯示新控制器時從一個顯示的視圖控制器的.view中「移動」到新的視圖。因爲按鈕有一個AppDelegate對象的目標(並且因此將它的消息發送給該對象),所以只要應用程序委託對象存在以接收消息(它作爲只要你的應用程序正在運行)。

+0

注意:這與爲您呈現的每個視圖控制器添加按鈕效果相同。不同之處在於,您每次都要添加* same *預配置按鈕,並且不必將「操作」響應代碼添加到所有視圖控制器以支持它。 – 2013-03-10 20:45:45

+0

我基本上是用iAds做的,這對它來說是另一個好用的。能夠爲出現的每個新的ViewController添加橫幅 - 無需擔心它在流程中從*中刪除的視圖 - 非常方便。重複使用一箇中央iAd橫幅對象,而不是讓每個控制器都啓動一個新的控制器(無論如何,這個速度非常慢)。 – 2013-03-10 20:50:15

+0

感謝您花時間回答並提供替代方案 – Diggory 2013-03-10 21:43:16

0

使用Swift,您可以利用協議和協議擴展的強大功能。我寫了一個關於這種方法的article。總之你需要以下內容:

  1. 創建一個描述覆蓋視圖控制器的協議。
  2. 使用協議擴展封裝呈現/解散視圖控制器到該協議的邏輯。
  3. 爲覆蓋主機創建一個協議。
  4. 使用協議擴展將從故事板實例化覆蓋視圖控制器的邏輯封裝到該協議中。

而你一切都準備好了。用法看起來像:

class ViewController: UIViewController, OverlayHost { 
    @IBAction func showOverlayButtonPressed() { 
     showOverlay(type: YourOverlayViewController.self, 
      fromStoryboardWithName: "Main") 
    } 
} 

的源代碼:https://github.com/agordeev/OverlayViewController

相關問題