我有一个.m文件,包含@implementation, 但它已经变得太大了,我试图将一些方法函数移动到第二个文件。
两个.m文件都以
开头@implementation GesticulatorViewController
@synthesize score_display;
@synthesize game_status;
@synthesize player_options;
@synthesize total_players_field;
@synthesize gesticulation_sentence;
@synthesize gesticulation_input;
@synthesize main_view_manager;
@synthesize game_state;
但是我收到链接器警告: “ld:重复符号_OBJC_IVAR _ $ _ GesticulatorViewController.gesticulation_input”
答案 0 :(得分:3)
您不能在两个不同的文件中使用相同的类实现。
在您的情况下,您无法将 GesticulatorViewController 的实现拆分为两个 .m 文件。
修改强>
我会使用Objective-C类别来分散实现。
使用类别,您可以将执行类似任务的方法组合在一起。
以下是Apple文档中“类别和扩展”的解释: https://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1
答案 1 :(得分:2)
我建议制作多个控制器。每个控制器处理一个不同的部分。
我正在制作视频应用。我有一个PlayerControlsViewController,它在视图中有所有播放和暂停按钮。
我还有一个工具控制器,里面有选择工具和任何菜单项。
这些控制器的属性采用控制器视图并从超级视图中删除。然后在自己的视图中的某个位置设置视图并将其连接到PlayerController。其中包含玩家。
每个控制器都有自己的代码来处理其任务。并通过每个协议将消息发送回主视图控制器。
这将在其他控制器之间来回切换命令,并在主视图控制器上保持设置。
我相信这是应用程序正常运行的预期操作标准,并且易于维护。
此方法也适用于导航控制器和Tab控制器。 由于它们维护自己的代码,因此您可以在自己的视图中添加另一个视图控制器视图。
在将其添加到视图中之前,请记住将其从超级视图中删除。
答案 2 :(得分:1)
如果一切都需要在一个视图中,但您认为实现太大,您可以随时进行类别:)只需转到File-> New-> Objective-C Category。然后在视图控制器上创建类别,并添加它!
请记住,您无法在类别中添加新的ivars或属性。但是,您可以使用原始类中的属性和ivars。
此外,如果您发现.m视图控制器文件中有很多代码,您可能会考虑进一步了解MVC范例,将某些功能拆分为其他类。请记住,视图控制器应该只处理视图更改 - 数据操作等应该由其他类完成:)
答案 3 :(得分:1)
另一种选择是将某些方法的源代码复制到另一个.m文件,然后在主.m文件中#include该文件。将#include放在从主文件中删除方法的位置。
使这项工作的诀窍是将#included源文件添加到您的项目中,但取消检查所有目标。您不希望Xcode尝试自己编译文件 - 只在主视图控制器文件中包含#include它。