2011-03-05 92 views
6

我正在寫一個通用的iOS應用(iPad和iPhone),並發現自己有大量長名字無法在兩個應用程序之間共享類:命名約定通用應用程序

FamilyViewController_iPhone.h/m 
FamilyViewControllerA_iPad.h/m 

DetailViewControllerB_iPhone.h/m 
DetailViewControllerB_iPad.h/m 

而且同樣,這些人內部的類具有完整的名稱(包含設備),以便Interface Builder可以輕鬆使用它們。

我認爲像AControllerA.h和BControllerA.h其中A = iPhone和B =的iPad,但不激動那選擇或者。

什麼是在iOS的普遍應用類這樣的獨立的公約 - 還是我(希望)缺少的東西,避免了這種必然性?

+0

Think Different的。 – drudge 2011-03-05 01:00:26

+0

Word :)所以 - 驅動程序是這樣的......我想利用iPad的獨特功能。我不想讓iPhone的應用看起來像iPhone的只是bcs代碼更容易管理。所以,沒有任何假設,應用程序可能會看起來不同,行爲也不同,並且具有不同的屏幕流/嚮導等 - 只是野獸的本質。我想我可以爲這些類使用完全不同的名稱,甚至不嘗試在類名中標識常用功能...... – 2011-03-06 17:00:48

回答

1

我不確定有一個標準的方法來處理這個問題。

一種可能性是使用一類簇狀的策略。如果FamilyViewController_iPad和FamilyViewController_iPhone非常相似,則將它們作爲抽象FamilyViewController類的子類。設置FamilyViewController的-initWithNibName:bundle:方法,以便返回... iPad或iPhone版本的實例,具體取決於應用程序在哪個設備上運行。然後,在你的大部分代碼中,你只能處理FamilyViewController。當然,您仍然需要在筆尖中使用子類名稱,但至少您的代碼將更易於閱讀。

+0

是的 - 這絕對是我的出發點。只是不確定是否有一個標準的做法,當你有一個EditorView ......這兩個平臺之間的差異很大(iPhone可能使用UITableView,而iPad可能使用自定義XIB,所有字段都像表單一樣放置)。 – 2011-03-06 16:57:56

4

我想你通過這樣的分離功能的標題下一個壞的路徑。雖然iPad應用程序顯然可以在iPhone應用程序中擁有不同的UI結構和設計,但如果您儘可能保持抽象,那麼這是最好的選擇。

我避免在視圖控制器中使用平臺名稱。我想有:

FamilyViewController.h 
FamilyViewController.m 
FamilyViewController.xib (which is used for the iPad UI) 
FamilyViewController~iphone.xib 

你最有可能會具有令人難以置信的類似功能的iPhone和iPad,或者,如果不一樣,你仍然有很多的重疊。

我也從來沒有讓我的視圖控制器充當我的表控制器。我將這個功能保存在單獨的對象中。這樣,如果iPhone應用程序在不同屏幕上具有2或3個表格,但iPad會在同一屏幕上顯示所有3個表格,則可以實例化每個表格控制器,並且所有代碼均可重複使用。

+0

我擔心iPad的細節視圖這樣的用例最終會與iPhone的細節視圖大不相同。我經常在iPhone上使用UITableView作爲編輯器模板 - 但我通常不會在iPad上這樣做。管理一個UITableView的邏輯將會瘋狂地推入一個View Controller中,該控制器還管理用於iPad的大屏幕XIB編輯器的邏輯。要充分利用iPad的大屏幕 - 我常常會得到非常不同的邏輯和屏幕流。重複使用與您所描述的相同的類並不總是很乾淨。 – 2011-03-06 16:54:46

+0

首先,我從來沒有把我的表數據源和委託代碼放到視圖控制器中。我發現這只是等待發生的痛苦。打破數據源並委託出一個單獨的類。是的,有時功能是非常不同的。如果是這樣,我將製作兩個IBAction方法,並將一個綁定到iPhone xib,另一個綁定到iPad xib。這些方法中的功能仍然無疑會共享一些位,並且我確保將它們分解爲單獨的方法,以便可以從兩種IBAction方法中調用它們。 – 2011-03-06 18:22:16

2

如果你想使用相同的類YourClass與YourClass.xib和YourClass-iPad.xib,然後檢查了這個宏,我用:

#define getXIB(s) ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? @"" #s "-iPad" :@"" #s) 

那麼你就可以使用類本身獲得正確的XIB文件:

YourClass * viewController = [[YourClass alloc] initWithNibName:getXIB(YourClass) bundle:nil];