2013-05-22 223 views
1

我只是在iOS應用程序上工作,我希望使它適用於iPhone和iPad。這樣做是和工作沒有任何問題:適用於通用(iPhone/iPad)應用程序的iOS控制器

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
    self.viewController_iPhone = [[ViewController_iPhone alloc] initWithNibName:@"ViewController_iPhone" bundle:nil]; 
} else { 
    self.viewController_iPad = [[ViewController_iPad alloc] initWithNibName:@"ViewController_iPad" bundle:nil]; 
} 

if (self.viewController_iPhone == nil) 
    self.window.rootViewController = self.viewController_iPad; 
else 
    self.window.rootViewController = self.viewController_iPhone; 

沒有爲每個控制器(ViewController_iPad.xib,ViewController_iPhone.xib)的圖。在我的問題中加載哪個視圖並不重要。在視圖中添加了一個子視圖(UIScrolView)。在這個ScrollView中有兩個來自xib的視圖:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"SubView1" owner:self options:nil]; 
UIView *view = [nibContents objectAtIndex:0]; 
view.frame = CGRectMake(2, 0, scrollView.frame.size.width - 2, scrollView.frame.size.height); 
[scrollView addSubview:view]; 


nibContents = [[NSBundle mainBundle] loadNibNamed:@"SubView2" owner:self options:nil]; 
view = [nibContents objectAtIndex:0]; 
view.frame = CGRectMake(scrollView.frame.size.width + 2 , 0, scrollView.frame.size.width - 4, scrollView.frame.size.height); 
[scrollView addSubview:view]; 

(此代碼在iPad/iPhone控制器中)。還是一切都好。但我不知道如何設置ScrollView中顯示的這些子視圖的所有者(在IB中)。這些子視圖位於主視圖中的ScrollView中,因此我想將這些子視圖的所有者設置爲iPad/iPhone控制器。但是,作爲一個所有者只能是一個班級。你能告訴我如何設置所有者,如果我有兩個主控制器,我不知道哪一個將在運行時加載。謝謝。

編輯:我有另一個問題:我有ViewController_iPhone。它有一個View屬性,這個屬性被分配到ViewController_iPhone(.xib)主視圖中的「root」視圖。我可以將這個視圖屬性也分配給子視圖嗎?因爲如果我將ViewController_iPhone的視圖屬性分配給IB中的子視圖的「根」視圖,我得到了EXC_BAD_ACCESS錯誤。

+0

如果您使用loadNibNamed加載nib,就像您已經做過那樣,那麼文件所有者沒有意義 –

+0

因此,在IB中將哪個控制器設置爲文件所有者並不重要,因爲使用loadNibNamed方法的owner:self參數會將此所有者「重置」到代碼所在的控制器?不會有問題,因爲例如擁有者被設置爲iPhone控制器並且iPad控制器將會加載它嗎? – DanielH

+0

雅這就是我說的......你正在從筆尖加載自定義視圖,你只訪問視圖對象。所以文件所有者不在遊戲中。請記住,不要將插座連接到文件所有者。將它連接到您的查看對象 –

回答

2

看起來您需要使用類集羣。這將抽象出iPhone/iPad的實例化,所以你不需要明確實例化兩者中的一個。 你可以閱讀蘋果文檔中的一些關於類集羣:

http://developer.apple.com/library/ios/#documentation/general/Conceptual/DevPedia-CocoaCore/ClassCluster.html

它歸結爲創建將處理iPhone或iPad的子類基於當前設備上分配的主視圖控制器。

應覆蓋的ViewController ALLOC類方法:

+ (id)alloc { 
     NSString *classString = NSStringFromClass([self class]); 

     NSString *append = nil; 

     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
      append = @"_iPhone"; 
     } else { 
      append = @"_iPad"; 
     } 

     NSString *subClassString = [classString stringByAppendingString:append]; 

     id subClass = NSClassFromString(subClassString); 


     id object; 

     if (subClass && ![self isKindOfClass:[subClass class]]) { 
      object = [subClass alloc]; 
     } else { 
      object = [super alloc]; 
     } 

     return object; 
    } 

這樣你可以分配的ViewController類,並在運行時正確的類定義將被用來實例化視圖控制器。 這將允許您使用ViewController類作爲IB的所有者,只要您創建iPhone和iPad界面的抽象並在其超類中定義它。

相關問題