3

我有一个 .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”

4

4 回答 4

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

于 2012-06-21T17:51:15.193 回答
2

我建议制作多个控制器。每个控制器处理不同的部分。

我正在制作一个视频应用程序。我有一个 PlayerControlsViewController,它的视图中有所有的播放和暂停按钮。

我还有一个工具控制器,其中包含选择工具和任何菜单项。

这些控制器的属性使控制器查看并从超级视图中删除。然后将视图设置在它自己的视图中的某个位置并将其连接到 PlayerController。将玩家安置在其中。

这些控制器中的每一个都包含自己的代码来处理其任务。并通过每个协议将消息发送回主视图控制器。

这将在其他控制器之间来回传递命令,并维护主视图控制器上的设置。

我相信这是应用程序正常运行且易于维护的预期操作标准。

此方法也适用于导航控制器和选项卡控制器。由于它们维护自己的代码,因此您可以在自己的视图中添加另一个视图控制器视图。

请记住在将其添加到您的视图之前将其从其超级视图中删除。

于 2012-06-21T17:57:04.360 回答
1

如果这一切都需要在一个视图中,但你认为实现太大,你总是可以做分类:) 只需转到 File->New->Objective-C Category。然后在您的视图控制器上创建类别,然后添加它!

请记住,您不能在类别中添加新的 ivars 或属性。但是,您可以利用原始类中的属性和 ivars。

此外,如果您发现 .m 视图控制器文件中有大量代码,您可能会考虑进一步研究 MVC 范例,将一些功能拆分为其他类。请记住,视图控制器应该只处理视图更改 - 数据操作等应该由其他类完成 :)

于 2012-06-21T18:07:07.913 回答
1

另一种选择是将某些方法的源代码复制到另一个 .m 文件,然后在主 .m 文件中#include 该文件。将#include 放在从主文件中剪切方法的位置。

完成这项工作的技巧是将#included 源文件添加到您的项目中,但取消选中所有目标。您不希望 Xcode 尝试自己编译文件 - 只需将其 #include 到您的主视图控制器文件中。

于 2012-06-21T18:46:14.103 回答