你可以为不同的目标有两个同名的 ViewController 实现吗?

Posted

技术标签:

【中文标题】你可以为不同的目标有两个同名的 ViewController 实现吗?【英文标题】:Can you have two implementations of a ViewController with the same name for differen targets? 【发布时间】:2013-09-24 01:33:38 【问题描述】:

(这是一个非常大的项目的简化描述)

我有一个有两个目标的 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's”.m 文件,而不是“B's”.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 文件.

【问题讨论】:

我也有同样的问题。即使在 Xcode 7 中,您可以选择“模块”(基本上是询问哪个目标),自动助手编辑器将选择第一个 ViewController 而不是第二个。更糟糕的是,虽然可以找到 2 个版本的 ViewController,但 Xcode 无法确定第二个在哪里...... 【参考方案1】:

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

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

【讨论】:

我相信你是对的。我将不得不“ifdef”或在 .h 和 .m 文件中使用条件编译。我可以有多个 xib 文件并相应地在复制捆绑资源中指定正确的 xib。我可能会制作不同的视图控制器并使用条件编译和 ifdef 来加载所需的 VC,或者我可能只是 ifdef 现有的 VC,我认为这两种方式都是一种清洗。【参考方案2】:

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

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

    首先创建一个类别来托管所有常用方法:ViewController+common 并添加相互包含以保持 iOS 目标正常运行 然后在 MacOs 的目标目录下,创建一个 ViewController_X 类来实现目标变体。该类导入常用类别 由于 common 类别导入原始 ViewController.h,因此需要在 MacOS 端创建 ViewController.h 的存根版本。这个存根文件是一个像这样的头文件:

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

现在在 MacOS 故事板中,使用 ViewController_X 类并且只看到相关的 IBOutlets。

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

【讨论】:

以上是关于你可以为不同的目标有两个同名的 ViewController 实现吗?的主要内容,如果未能解决你的问题,请参考以下文章

连接来自不同数据库的同名表的结果

java里,为啥子类不可以有 和父类 同名不同返回类型 的方法?

比较两个目录,查找同名但内容不同的文件

合并两个目录,保留任何同名文件

diff - 找出两个文件的不同点

包体中有两个同名但参数不同的函数是啥意思?