2013-09-24 42 views
0

(这是一个非常大的项目的简化描述)你可以为不同的目标有两个同名的ViewController实现吗?

我有一个XCode项目有两个目标。两个目标之间的唯一区别是每个目标都有一个不同的视图控制器实现。

视图控制器有一个xib,它只是一个带有UITextView的简单视图。我们称之为TextReportViewController。

实现“A”打印,所以它有一个按钮,允许您打印UITextView的内容。它在一个名为“A”的组中。

实现“B”有电子邮件,所以它有一个按钮,允许您通过电子邮件发送UITextView的内容。它在一个名为“B”的组中。

目标“A”在其“编译源”中包含组“A”中的.m文件,“复制软件包资源”包含组“A”中的xib。

目标“B”在其“编译源”中包含组“B”中的.m文件,“复制软件包资源”包含组“B”中的xib。

我在“A”之后添加了“B”,也就是在我决定让另一个目标事物与“A”一起工作之前。

当我编辑“B”xib文件并检查“文件的所有者”,并在身份检查器中单击自定义类类型的箭头时,它将转到“A”的.m文件,而不是“B”。 m文件。

当我查看文件所有者的出口时,它是来自“A”和“B”的出口的组合。

我向“B's”xib添加了一个控件,并在助理编辑器中显示了“B's”.h文件,然后拖动一个按钮创建一个IBOutlet并将它放入“A's”.h文件中代替。

我需要做些什么来确保目标A正在使用A的.h文件和xib文件,并且目标B正在使用B的.h文件和xib文件。

请注意,当我添加目标“B”时,它创建了一个名为“B”的文件夹。因此,文件位于这样的:

根:

TextReport: 

    TextReportViewController.m 

    TextReportViewController.h 

    TextReportViewController.xib 

B: 

    TextReport: 

     TextReportViewController.m 

     TextReportViewController.h 

     TextReportViewController.xib 

而且当我编辑“B” XIB文件,我展现助理编辑,选择“自动”,显示h和。 m文件,它显示四个,两个.h文件和两个.m文件。

+0

我有这个完全相同的问题。即使在Xcode 7中,您可以选择“模块”(基本上询问哪个目标),自动助理编辑器会选择第一个ViewController而不是第二个。更糟糕的是,尽管可以找到2个版本的ViewController Xcode无法找出第二个是哪里...... – DerrickHo328

回答

0

我怀疑你不能有这种设置。即使您的每个目标都使用了您的VC的不同副本,但您必须在Xcode项目中拥有同名文件的两个副本。这是混乱开始的时候。当您在IB中指定xib的所有者时,您提供类的名称,但不提供定义文件的路径。所以你不能真正知道这两个文件中的哪一个正在被使用。

我建议对不同的目标使用不同的名称。

+0

我相信你是对的。我将不得不在“.dedef”或在.h和.m文件中使用条件编译。我可以有多个xib文件,并相应地在副本捆绑资源中指定正确的xib。 我可能会制作不同的视图控制器,并使用条件编译和ifdef的加载所需的VC或我可能只是如果现有的VC,我认为这是一种洗的方式。 –

0

这是一个迟到的答案,张贴它的记录。 我遇到了同样的情况,并寻找解决方案。由于我没有办法告诉Xcode Interface Builder忽略其他目标文件,所以我设置了这个解决方法:

假设在一个iOS目标中,有一个类ViewController,并且想为MacOS目标故事板制作一个MacOS版本同时使用其原始实施的一部分。

  1. 先制作一个类来承载所有常用的方法:视图控制器+通用和添加共有包括保持iOS的目标并在MacOS上的目标目录中运行
  2. 然后,创建一个ViewController_X类来实现目标的变体。此类导入常见类别
  3. 由于常用类别导入原始ViewController.h,因此需要在MacOS端创建ViewController.h的存根版本。该存根文件是一个标题只有文件是这样的:

#import "ViewController_X.h" @compatibility_alias ViewController ViewController_X;

在MacOS的故事板

现在,使用ViewController_X CLASSE只看到相关的IBOutlets。

此外,包括ViewController.h在内的任何常见文件都会为其目标查看适当的类。

相关问题