你可以为不同的目标有两个同名的 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 实现吗?的主要内容,如果未能解决你的问题,请参考以下文章