1

私はiOSアプリに取り組んでおり、iPhoneとiPadの両方でユニバーサルにしたいと考えています。これは行われ、問題なく動作します:

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)。私の問題にどのビューがロードされているかは問題ではありません。ビューには、追加されたサブビュー (UIScrollView) があります。この ScrollView には、xib からの 2 つのビューがあります。

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 コントローラーとして設定したいと考えています。ただし、所有者としてできるのは 1 つのクラスのみです。2 つのメイン コントローラーがあり、どちらが実行時に読み込まれるかわからない場合、所有者を設定する方法を教えてください。ありがとうございました。

編集: 別の質問があります: ViewController_iPhone があります。これには View プロパティがあり、このプロパティは ViewController_iPhone (.xib) のメイン ビューの「ルート」ビューに割り当てられます。このビュー プロパティをサブビュー ビューにも割り当てることはできますか? ViewController_iPhone のビュー プロパティを IB のサブビューの「ルート」ビューに割り当てると、EXC_BAD_ACCESS エラーが発生したためです。

4

1 に答える 1

2

クラスクラスターを使用する必要があるようです。これにより、iPhone/iPad のインスタンス化が抽象化されるため、2 つのうちの 1 つを明示的にインスタンス化する必要はありません。Apple のドキュメントで、クラス クラスタリングについて少し読むことができます。

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 クラスを割り当てるだけで、実行時に正しいクラス定義を使用して View Controller をインスタンス化できます。これにより、iPhone および iPad インターフェイスの抽象化を作成し、それらのスーパー クラスで定義する場合、ViewController クラスを IB の所有者として使用できます。

于 2013-05-22T08:06:55.087 に答える