iOS项目目录组织

Posted

技术标签:

【中文标题】iOS项目目录组织【英文标题】:iOS project directory organisation 【发布时间】:2012-01-15 17:51:50 【问题描述】:

关于如何为您创建的每个 ios 应用安排 Xcode 4 目录的问题/意见。

就个人而言,我仍然添加一个名为 /Resources 的目录,其中包含 /Fonts、/Images、/Icons 等子目录。我使用选项“将项目复制到目标组的文件夹(如果需要)”。如果我需要添加一个新的资源,我只需将它添加到我的项目目录中 finder.app 中的正确目录(即,如果它是一个图像,我将它添加到 MyProject/Resources/Images/Foo.png)然后我只需继续我在 Xcode 中的“图像”组并从那里添加文件。

我曾经尝试使用“文件夹引用”选项来保持 Xcode 和 Finder 同步,但 IB 无法获取图像...

另外,您的 Icon.png 和 Default.png 是否位于项目的根目录? (即使用 .xcodeproj 文件?)当您使用 Xcode 4(在项目信息>摘要中)时,他们将它们添加到那里...想知道您是否将它们保留在那里,因为就我个人而言,我总是更喜欢将所有图像放在示例目录中!

那么 Photoshop 文件或与您的项目相关的任何其他文件呢,您是否也将它们放在根目录中(再次使用 .xcodeproj 文件)?

【问题讨论】:

我认为这完全取决于你必须将它保存在哪里,它们对目录结构没有指导或规则。 我知道没有“严格”的规则,我想知道人们如何构建他们的项目,就是这样:) 你也可以参考以下iphone sdk论坛的帖子-iphonedevsdk.com/forum/iphone-sdk-development/… 如果是这样的话,那么我可以告诉你一些关于我所遵循的结构的信息。 MyProject - MyProject.xcodeproj, Classes( -> Models, Controllers), Images( -> Parents (包含 photoshop 文件)), ... 【参考方案1】:

我建议将所有 .m 和 .h 和 .xib 文件保存在一个文件夹中,因为它可以在您运行 ibtool 以提取所有 NSLocalizedString 引用时简化字符串的本地化,而且它还可以更轻松地在虚拟环境中移动文件重构项目时 Xcode 中的文件夹结构。

将第三方库或框架保存在单独的文件夹中,以避免将它们与您自己的代码混淆。

在 Xcode 本身中,我将这些类文件组织到单独的虚拟文件夹中,称为 Views、Controllers、Model 和 Nibs(以及用于 3rd 方的东西的库)。如果它是一个大型项目,我会将其分解为每个组件的文件夹,然后将它们分解为视图、控制器等,但同样,这只是虚拟文件夹,而不是物理文件夹。

将资源保存在单独的物理文件夹中是一个好主意,这样可以更轻松地在磁盘上浏览它们。将它们拆分为图像、声音、xml 等可能是有意义的。在 Xcode 中,您可能希望按组件或类别(接口、内容等)将它们分解为虚拟子文件夹,但我不建议在磁盘上这样做随着项目的增长,重构文件夹结构变得更加困难。

将所有图像保存在同一个文件夹中是一个非常好的主意,因为这样可以避免您不小心将两张图像同名。如果你从不同的地方导入两个同名的图像,Xcode 不会警告你,但是当它构建应用程序时,你最终只会得到一个或另一个,随机选择。

您不必将 Default.png 和 Icon.png 保留在根目录中(甚至称它们为 Default.png 和 Icon.png),但有时如果标准文件不在预期的位置,Xcode 会感到困惑。

是的,无论您做什么,在导入图像时都不要尝试使用蓝色文件夹引用,否则您无法使用 imageNamed: 从代码中或在 Interface Builder 中访问它们。请改用黄色的虚拟文件夹引用。基本上,在构建应用程序时,蓝色文件夹作为实际文件夹被复制到应用程序包中,而黄色文件夹被忽略,它们的内容直接进入应用程序包的根目录。要访问蓝色文件夹中的内容,您需要在加载它们时在路径中包含蓝色文件夹名称,例如

NSString *path = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png" inDirectory:@"nameOfBlueFolderInXcode"];
UIImage *image = [UIImage imageWithContentsOfFile:path];

【讨论】:

我同意,除了“将所有 .m 和 .h 和 .xib 文件保存在一个文件夹中”。那会让我发疯,在我的 svn 存储库中没有结构!但对每个人来说都是他自己的。 好吧,如果您使用 svn,您就会知道在 svn 托管的项目中在文件夹之间移动文件是多么痛苦。在不破坏本地链接和 svn 存储库的情况下,将自定义 UIButton 子类从类/somecomponent/views/ 移动到类/共享/视图作为重构过程的一部分所涉及的工作量将使我无法重构,以及任何让良好的实践努力工作是一个坏主意恕我直言。 另外,请注意我关于使用 ibtool 生成 localizable.strings 文件的观点。 ibtool 是一个命令行工具,它采用文件夹路径并从里面的所有类生成单个字符串文件。它不搜索子文件夹,所以如果你的类不在一个文件夹中,它会使本地化变得更加繁琐。 我想你也可以在项目的根目录下有一个名为 /Photoshop 的目录来在 git 上跟踪它?你只是不将它添加到 xcode 项目中(添加文件...)我想所以它不会被存档? 我通常称它为 /Source Assets 之类的东西(它可能包括声音或视频文件以及 PSD)并将其放在项目目录之外,因为我希望能够保留项目资产和源资产分开,但是是的。源资产往往比项目的其余部分大几百倍,如果您与设计师合作,他们不太可能使用 git 进行源代码控制,因此管理 PSD 往往需要与其他部分不同的策略你的项目资产(我推荐一个共享的保管箱文件夹)。【参考方案2】:

我最近一直在思考这个问题;这是我决定采用的结构:

ProjectName
ProjectName/Assets
ProjectName/Assets/Images
ProjectName/Frameworks
ProjectName/Logic
ProjectName/Logic/Models
ProjectName/Presentation
ProjectName/Presentation/ViewControllers
ProjectName/Presentation/Views

我认为这为增长提供了良好的结构,并为大多数事物提供了合理的归宿。当然,根据需要添加额外的子文件夹(例如Assets/Fonts)。有关结构的完整理由,请查看this blog post。

我确实将Icon.pngDefault.png 之类的东西放在项目的根部,因为Xcode 似乎对它很挑剔,但除此之外一切都井井有条。我将相应的.m.h.xib 文件保存在一起,但我将视图控制器按功能逻辑拆分为子文件夹(例如InitialSettings)。

【讨论】:

以上是关于iOS项目目录组织的主要内容,如果未能解决你的问题,请参考以下文章

:Python项目组织结构-第二节:模块内置变量

谈谈iOS 项目的目录结构

iOS 项目集成 Cordova

:Python项目组织结构-第一节:包模块以及__init__.py文件

项目组织战略管理

Selenium 自动化组织项目