2012-01-12 77 views
7

背景在單個視圖控制器中使用多個nib文件?

我正在使用界面生成器爲我正在創建的應用創建UI。該應用程序有一個顯示一系列按鈕的單個屏幕。點擊一個按鈕會顯示一個覆蓋按鈕的相關視圖。點擊另一個按鈕隱藏以前的覆蓋視圖並顯示另一個視圖。

太讓管理更簡單的用戶界面在IB我已經決定要創建多個筆尖文件是點擊相關按鈕時會出現在每個子視圖。然後,我使用UINib類在視圖控制器的viewDidLoad方法中加載子視圖的nib文件。

這背後的想法是,以避免在一個單一的筆尖文件堆疊在彼此的頂部上,因爲這將是很難在IB來操縱多個視圖。我可以在代碼中創建所有視圖,但是這需要很多繁瑣的編碼,因爲每個子視圖的佈局都非常複雜(具有多個子視圖)。

從nib文件加載子視圖的示例代碼。

- (void)viewDidLoad 
{ 
    UINib *aSubViewNib = [UINib nibWithNibName:@"aSubView" bundle:nil]; 
    NSArray *bundleObjects = [aSubViewNib instantiateWithOwner:self options:nil]; 

    // get root view from bundle array 
    UIView *aSubView = [bundleObjects objectAtIndex:0]; 
    [self.view addSubview:aSubView]; 
... 

上面的代碼重複其他視圖。

總之我有一個有分層的是顯示/隱藏通過點擊按鈕的觀點在一個屏幕的iPhone應用程序。這是通過一個具有關聯的nib文件的單個視圖控制器以及一系列用於視圖控制器的viewDidLoad方法中加載的子視圖的附加nib文件實現的。

問題!

對不起,長介紹,但我想很清楚這是我在做什麼。

  • 是我的做法不好或不尋常?
  • 這樣做有什麼潛在的問題嗎?
  • 當他們需要動態接口時,其他人還做了什麼,並且 仍然希望在Interface Builder中保留所有內容?

注意

之前有人問我爲什麼不只是顯示一個新的屏幕上的子視圖,並使用導航欄,讓我說,我有很好的理由,我不明白的iOS UI準則。上面的用例並不完全是我的用例,但它清楚地描述了問題,而沒有陷入我的開發應用程序中。

而且我知道我可以寫所有的子視圖作爲代碼,但每個子視圖有子視圖一個複雜的佈局,這將是一個很大的代碼和插科打諢,試圖讓他們找合適的。

在此先感謝。

回答

1

視圖控制器和視圖之間不一定是1對1的關係。大多數視圖都包含許多子視圖,這些視圖本身是視圖,所以這從字面上看並不合理。

但是,根據視圖的複雜性(包括其內容),您可能需要單獨的視圖控制器...或不需要。

例如,如果您有兩個sbuviews,每個tableViews,您可能想要爲每個tableView有一個視圖控制器。這是因爲每個tableView都在查看相同的委託方法,並且如果它們在同一個viewController中,那麼委託方法必須區分tableView。委託方法的簽名允許這樣做,但根據我的經驗,它確實會造成難以遵循且難以管理的凌亂的代碼設計。另一方面,您可能有兩個表由同一個viewController管理,其中一個表充滿了有意義的數據,另一個表只是一個佔位符(與數據源爲空時一樣)。一個可能可見,而另一個不可見。當兩個視圖控制器都由相同的數據源(模型)驅動時,爲什麼讓您的生活變得複雜?

在我看來,這歸結於遵循和管理代碼有多困難。如果使用單個視圖控制器的複雜性變得繁重,則可以考慮使用更多的視圖控制器。

UPDATE

順便說一句,我有我目前與工作可以說明類似的情況的例子。在許多開發人員使用的InAppSettingsKit中,有幾個用於主視圖片段的xib文件。 You can look at the structure here on github。有一個主視圖控制器和幾個xib文件。 (我也稱之爲「助手」視圖控制器和電子郵件編輯器視圖控制器。)在此示例中,可以多次使用xib文件來指定表視圖單元格的佈局。儘管如此,每個xib文件都沒有視圖控制器。 (InAppSettingsKit的文檔很稀疏,所以這些東西可能不是很明顯,只是快速瀏覽一下。)

+0

因此,對於我將視圖拆分爲單獨的nib文件的唯一原因是爲了更容易地管理IB中的這些視圖,您認爲我的方法可以安全使用,還是會破壞Apple的準則? – Camsoft 2012-01-13 10:18:54

+0

關於你在做什麼沒有規則或指南。你在這方面很好。 – Jim 2012-01-13 15:38:06

+0

我添加了許多開發人員使用的真實軟件組件的示例。有關更多詳細信息,請參閱上面的答案 – Jim 2012-01-13 17:22:49

1

每個視圖都應該有一個對應的UIViewController。使用一個ViewController來「控制」多個視圖打破了MVC範例。從一個控制器「控制」多個「視圖」會使得更改一件事而不會破壞其他事情變得更加困難。您如何向最終用戶展示內容的選擇會因個人而異。所以,如果你說一個NavigationController不能用於你的情況,也許一個Modal視圖就是答案,或者你可能只是實例化你的自定義UIViewControllers並將它們添加到你的視圖([addSubview:]),如果這就是你想要的道路,但就像我說過的那樣,爲每個視圖對象和相應的xib創建一個「控制器」將是有益的。如果您需要回發信息,請使用委託或使用通知將郵件發送回父視圖。我學會了不遵循MVC範式的難題,會讓你的生活變得悲慘。儘量保持代碼儘可能分離。並閱讀MVC設計模式,您不會後悔。

+0

所有子視圖都與單一屏幕,並且因此單個視圖控制器。我可以很容易地將所有的子視圖添加到同一個nib文件中,但是就像我說的那樣,由於視圖重疊,它變得混亂和難以佈局。 我的想法是將一些視圖分解爲單獨的nib文件,然後使用視圖控制器的viewDidLoad方法將它們加載回主視圖。 – Camsoft 2012-01-13 10:14:02

+0

每個視圖都應該有一個對應的UIViewController。使用一個ViewController來「控制」多個視圖打破了MVC範例。如果這是真的,通用視圖控制器如何工作?它有2個筆尖。 – Juan 2013-01-17 04:53:46

+0

@胡伯特我在想同樣的事情。似乎有一些與此相關的問題。如果決定是在運行時間和點擊按鈕上進行的,這是否意味着xib將被加載到背景中,實際上它們都會被加載,而其中一個會被選中?此外,自動佈局可以輕鬆解決問題。 – 2016-07-22 18:47:18

0

實際上它可以做到這一點。打開你的.xib文件,選擇File's Owner(在佔位符) - >「identity inspector」(utilities) - >改變class name到你的控制器classname - >按住control並拖動文件的所有者佔位符到View對象,選擇「查看「對話框中。 現在您可以自定義您的視圖。

p.s.您可以使用與第一個xib相同的插座,您只需將它們拖到新的xib(+確定控制)即可。

這裏是一個解釋教程: http://irawd.wordpress.com/2013/09/05/how-to-link-a-xib-file-to-a-class-and-use-2-xib-files-for-iphone4-and-iphone5/

+0

在SO中張貼鏈接可能不錯,但鏈接往往會丟失......請在答案主體中發佈您答案的關鍵要素。 – NirMH 2014-05-18 09:52:02

+0

@NirMH編輯。感謝您的反饋,它是我的第一個回答 – user3206558 2014-05-18 11:25:54

相關問題