代码之家  ›  专栏  ›  技术社区  ›  bpapa

如何在iPhone3.1.3模拟器上运行通用应用程序?

  •  10
  • bpapa  · 技术社区  · 15 年前

    我正在开发一个新的应用程序,我想在iPhone和iPad上实现通用性。我从“创建基于窗口的应用程序”向导开始,它在“iphone”和“ipad”组中创建了单独的应用程序代理。因为我已经很熟悉iphone dev,所以我做了我项目的一部分,现在我准备做一些ipad的事情。

    所以…我开始在我的ipad代理中添加uisplitviewcontroller,将活动的sdk切换到3.2,它就工作了!但是当我切换回3.1.3,并尝试在模拟器中运行它时,build-and-go失败了。首先,我看到:

    …路径…/ipad/appdelegate_pad.h:13:错误:在'uisplitviewcontroller'之前需要说明符限定符列表

    我的基本SDK设置为3.2,部署目标设置为3.1.3。我觉得已经够了。但我也在文档中找到了这种有条件编译的方法:

    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
       MyIPadViewController* vc;
    // Create the iPad view controller
    #else
       MyIPhoneViewController* vc;
    // Create the iPhone view controller
    #endif
    

    所以我需要在任何地方都这样做吗?似乎要添加的代码太多了(不管怎样,我将在4.0的短时间内删除这些代码),所以我觉得我一定是做错了什么。而且,我甚至不知道这对于@property或@synthesis声明是如何工作的。

    问题的医生版本-我错过了某个地方吗?

    3 回复  |  直到 11 年前
        1
  •  23
  •   Ole Begemann    15 年前

    恰恰相反。通用应用程序在iPhone和iPad上运行相同的二进制文件,因此您不能使用条件编译来区分这两个版本。但您需要使用文档中的宏apple cites:

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        // iPad-specific code
    } else {
        // iPhone-specific code
    }
    
        2
  •  39
  •   progrmr    11 年前

    我使用这个C函数帮助保持代码简洁:

    BOOL isPad() {
        return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
    }
    

    另一件事是,当我的iPhone和iPad有不同的XIB文件时。我有一个stripPadSuffixOnPhone()函数,可以帮助简化代码:

    // Load/create the Delete table cell with delete button
    self.deleteCell = [Utilities loadNib:stripPadSuffixOnPhone(@"DeleteCell~ipad") 
                               ClassName:@"DeleteCell" 
                       Owner:self];
    

    这样做可以使编码更简单,条件也更少。尽管如此,还是要测试所有东西两次。

        3
  •  0
  •   Bob Withers    15 年前

    以下是适合我的:

    1. 使用SDK 3.2构建应用程序。
    2. 将活动的SDK切换到iPhone Simulator 3.1.3(或其他)。
    3. 从运行菜单中选择调试(不是生成和调试)。

    在3.2下构建的二进制文件将安装在3.x模拟器中,而不需要重建。完成后,不要忘记将活动的SDK设置回3.2。