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)。在我的问题中加载哪个视图并不重要。在视图中添加了一个子视图(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) 中主视图中的“根”视图。我可以将此视图属性也分配给子视图视图吗?因为如果我将 ViewController_iPhone 的视图属性分配给 IB 中子视图的“根”视图,则会出现 EXC_BAD_ACCESS 错误。

4

1 回答 1

2

看起来您需要使用类集群。这将抽象 iPhone/iPad 实例化,因此您不需要明确地实例化两者之一。您可以在 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 类,并在运行时使用正确的类定义来实例化您的视图控制器。这将允许您将 ViewController 类用作 IB 中的所有者,前提是您创建 iPhone 和 iPad 接口的抽象并在它们的超类中定义它。

于 2013-05-22T08:06:55.087 回答