3

我打算开发一个完整版、精简版和免费版的应用程序。(或至少其中两个)

过去,在没有 Storyboard 的情况下,我只是添加了另一个目标并设置了编译器变量,并使用 #if/else/endif 语句来管理版本之间的差异。到目前为止一切都很好。

这次我第一次使用故事板。它有大约 50 个视图控制器。现在我面临如何处理这个问题。特别是因为完整的应用程序是基于标签栏的,而精简版应该没有标签栏(它所涵盖的功能不超过与完整版本的标签之一相对应的功能)。

我该如何处理?我需要第二个故事板吗?我能否在情节提要 #2 和 #3 中重用情节提要 #1 中的视图?或者我是否可以至少使用第二个故事板作为起点,然后分支到故事板#1 的部分?(同样,精简版应用程序将主要包含完整应用程序的选项卡之一中的功能)。

坦率地说,我什至不知道从哪里开始。这就是为什么我不能分享我迄今为止尝试过的东西。任何提示表示赞赏。

4

1 回答 1

2

好吧,终于找到合适的方法了。尽管我对它并不完全满意,因为它不是我想要的,但它确实有效,并且为我提供了高度的重用。

1) 在 xcode 中创建一个新目标。

2) Xcode 将创建第二组故事板。

3)故事板默认与原始名称相同,但位于不同的名称(由 xcode 新创建)并为每个目标分配一个。我重命名它是因为我的第二个目标中需要两个故事板.. 不需要重命名如果每个目标只使用自己的故事板。但在这种情况下,您应该重命名它。如果重命名它,则需要在目标的项目设置中分配新名称。效果很好。

4) 在我的例子中,免费应用程序的情节提要基本上由它的根视图控制器和一个常规视图控制器组成,它使我成为用户的一些主菜单。在我的情况下,完整的应用程序基于选项卡,并且由于功能减少和一些更精简的用例,免费应用程序不是。

5)然后这个主菜单视图控制器将以编程方式连接到另一个故事板的视图控制器。为此,情节提要中的所有 ID 都必须正确设置且唯一 (!)。在我的例子中,这个菜单由许多按钮组成。它们中的每一个都调用一个 IBAction。你当然可以给我们一张桌子等等。

 - (IBAction)newMinutes:(id)sender
 {
     // Get the storyboard named secondStoryBoard from the main bundle:
     UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];

     // Load the view controller with its identifier string 
     // Change UIViewController to the appropriate class
     UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"MinutesMenu"];

     // Then push the new view controller in the usual way:
     [self.navigationController pushViewController:theTabBar animated:YES];
 }

6)一旦这个视图控制器启动并运行,它就会在自己的故事板中很好地工作,并将完美地连接到后续的视图控制器等。

7)但是,在某些地方我仍然需要做出一些改变。对于这些情况,我在每个目标的项目设置中设置了两个宏。FREE并且FULL是那些宏。因此,我可以使用该构造编译稍微不同的代码,例如程序化 segues #ifdef

#ifdef FULL 
  // do this
#else 
  // do that
#endif

或者

#ifdef FREE
  // do this
#endif

希望,这有助于 TJ 和其他处于相同情况的人。

于 2013-03-06T09:21:19.950 回答