2014-07-23 26 views
0

我的要求是我要聲明一個類的對象,具體取決於deviceFamily是iPad還是iPhone的條件。 我爲iPhone開發了一個應用程序。現在我想爲iPad開發相同的應用程序。現在我想爲iPhone和iPad使用兩種不同的名稱,分別爲.h,.m.xib。但是我想在AppDelegate類的通用應用中使用兩個不同類的同名對象。在條件內聲明一個類的對象

喜歡的東西在.h文件:

if(IS_iPad) 
{ 
ViewController_iPad * obj; 
} 
else 
{ 
ViewController_iPhone * obj; 
} 

所以我可以使用對象的同名整個應用程序。

我該如何做到這一點。幫幫我!

+0

所以想要同一個應用程序的兩個不同版本;一個用於iPhone和一個用於iPad? – trojanfoe

+0

我不明白你的問題:當你在上面的代碼中定義你的「obj」時,範圍是2個選擇的局部。所以你可以給他們同名或不同意;不要緊。你想實現什麼? –

回答

0

也許我現在明白你想實現什麼:你想要定義交替不同的對象,但是在聲明範圍外以相同的名稱訪問它們。如果是這樣,怎麼樣:

@property (strong) UIViewController *obj; 
... 
if(IS_iPad) 
{ 
obj = [[ViewController_iPad alloc] initWithNibName:nibName bundle:nil]; 
} 
else 
{ 
obj = [[ViewController_iPhone alloc] initWithNibName:nibName bundle:nil]; 
} 

我認爲這兩個類的子類UIViewController,所以任務將是確定。當然,必須爲視圖控制器使用正確的初始化。

+0

我相信OP正在尋找一個編譯時解決方案。 – trojanfoe

+0

該對象是UIView類型的。如果我在聲明時使用它UIView類型,那麼自定義屬性不會被繼承。 – NiKKi

+0

hmmm ...在你的例子中,你用作「obj」ViewController_iPad和ViewController_iPhone的類,它們不是UIViews。無論如何,如果您將這些對象分配給它們的超類,它們將保留它們的子類屬性。您只需將超類轉換爲實際的子類即可訪問它們。 –

2

我會查看類集羣,如iOS7 Tech Talks所述。查看會話結束「構建現代應用程序,第2部分」,從幻燈片開始於第120頁。

本質上,您可以從其他使用它的類隱藏類的確切實現。在下圖中,該應用程序使用類「下載控制器」,但不需要知道操作系統是否具有NSURLSession或需要默認爲NSURLConnection。我認爲這種模式適合你的問題。

enter image description here

兩個這樣實現的代碼看起來是這樣的:

@interface MyViewController_iPhone : MyViewController @end 
@interface MyViewController_iPad : MyViewController @end 

@implementation MyViewController 

+ (instancetype)newViewController { 
    if (IS_iPad) { 
    return [[MyViewController_iPad alloc] init]; 
    } else { 
    return [[MyViewController_iPhone alloc] init]; 
    } 
} 
... 
@end 
+0

我的兩個類的接口是從UIView繼承的。 1)CustomView1和2)CustomView2。通過遵循您的方法,我在使用兩個自定義類中訪問聲明和defiened的自定義屬性時遇到錯誤。運營商。只能夠訪問UIView的屬性。 @mundi – NiKKi

4

這可能是創造一個「通用」的應用程序在沒有最好的方法(包括iPad和iPhone),但所有我見過的採用這種模型的實例,他們似乎採取了關於控制器的鏈條邏輯...

UIViewController * sharedController = [[UIViewController alloc] init]; //這是兩個設備之間共享的東西在這裏走(一次寫入,不能重複)

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) // PAD 
{ 
    ViewController_iPad * obj; 
} 
else if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) // PHONE 
{ 
    ViewController_iPhone * obj; 
} 

兩個視圖控制器的上述要麼包括sharedController作爲一個屬性來利用代碼的出現或更好..

使sharedController成爲'基類'。然後製作這個類的ViewController_iPad和ViewController_iPhone子類(共享)。

爲此,在ViewController_iPhone和ViewController_iPad的.h頭文件中,將它們設置爲像這樣的sharedController的子類。

@interface ViewController_iPad:sharedController

它的一種方法,如果你真的要做這種方式。