2014-02-18 31 views
1

注意:我不是在談論Master-Detail SplitViews!設置場景的母版頁

有一個類似這樣的問題(Master page concept in Iphone development),但問題只涉及標準功能,而不是佈局本身。此外,答案僅顯示如何避免重複的代碼,但您仍然必須在每個場景上鍊接IBActions。也許我們可以擴展鏈接的問題,並發現一些更好的解決方案:-)

所以,我想爲我的應用程序中的所有場景/視圖控制器定義一個母版頁。例如在網頁開發中這是一個常見的任務(即ASP.NET Masterpages)。

母版頁將包含實際佈局(背景顏色,標題所在的位置,內容的位置等)以及所有場景中的標準功能(打開菜單,返回,打開幫助頁面等)

使用Interface Builder(有或沒有Storyboard),最好的方法是什麼?

這裏是我的想法:

選項1:子類的UIViewController標準的特點,在每一個場景/視圖 - 控制copypaste公共佈局。

優點:相當容易使用,只需複製所有控件,在IB中設置父類並連接標準功能按鈕。

缺點:如果你有很多場景,你會很容易忘記連接標準功能。如果由於任何原因主佈局發生變化,您就會被擰緊。

選項2:無論是佈局和功能在一個地方進行處理,並容易改變:子類的UIViewController,在viewDidLoad,在這裏你還設置了事件目標

優勢加上佈局編程的地方。

缺點:您需要以編程方式設置佈局,如果您在其他地方使用IB,則不一致。您在IB看不到主佈局,所以您必須「想象」它在IB中配置場景的其餘部分。 如果沒有故事板,您可以使用XIB來設計內容視圖,但是您從未在IB中擁有「整個圖片」。此外,這不適用於故事板。

這兩個選項對我來說都不是很優雅。你做什麼方法(這是一個常見問題!)?

回答

1

有很多方法可以做到這一點。我最喜歡的兩種方式如下。

在他們兩個人中,你開始使用(使用你的術語)MasterVC。做所有的共同元素的佈局和設計。然後對於contentView:

  1. 放入單獨的視圖,並以編程方式添加childViewControllers;或者
  2. 放入一個容器視圖,它包含一個UICollectionView。在collectionView中創建一個佔據整個collectionView的單元。創建一個帶有一個插口的自定義單元類(在我的示例中爲pageView),並以兩種方式之一從故事板加載ViewControllers。將VC的標識符設置爲表示它們將出現在collectionView中的位置的數字,或者創建一個VC名稱數組。然後,每當用戶導航到某個VC時,就告訴collectionVC滾動到該索引。

在cellForItemAtIndexPath的實施將是這個樣子:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    AMMasterCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath ]; 

    for (UIView *view in cell.pageView.subviews) 
     [view removeFromSuperview]; 

    NSString *viewID = self.arrayOfViewControllerNames[indexPath.item]; 

    AMMasterViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:viewID]; 
    AMMasterView *pageView = (AMMasterView *)viewController.view; 
    [cell.pageView addSubview:pageView]; 

    [self addChildViewController:viewController];     
    [viewController didMoveToParentViewController:self]; 

    return cell; 
} 

我這個做了一堆倍,它精美的作品。

+0

你的想法與UICollectionView是聰明的。然而,在iOS5/6中,有一些UIContainerViews我認爲正是我想要的。 UICollectionView把我帶到那裏,所以我接受你的答案。謝謝! – JiaYow

0

如果您的標準佈局包含通過IBOutlets鏈接到您的代碼的創建控件,則只有兩種方法將其添加到故事板或以編程方式。迄今爲止的邏輯。

現在,我就是這麼想的。如果所有視圖都有相同的控件(不太可能),那麼您可以在故事板中創建一個視圖並生成它。在更合理的情況下,他們共享一系列控制,並且想要標準化那些有三種選擇的控制。

  1. 你建立自己的標準設計,分鏡,並添加在每個視圖編程
  2. 你編程方式創建標準設計所需的控制和故事板
  3. 添加其他控件盡一切編程

我很可能會選擇選項2並按此方式組織:

  1. Crea TE的一種功能setupView設置標準設計
  2. 在視圖中沒有使用設計每個視圖的負載我會打電話[whereEverYouPutThis setupView];

使用此選項可以使變化在一個地方你的主人非常迅速,你可以使用故事板來製作視圖特定的東西。

相關問題