【问题标题】:How can I conditionally declare a delegate in an interface declaration?如何在接口声明中有条件地声明委托?
【发布时间】:2011-07-01 17:25:24
【问题描述】:

我有一个构建到两个不同目标的 Xcode 4 项目。我在构建设置中定义了一些常量,因此我可以为每个目标运行不同的代码,如下所示:

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

在应用程序的一个版本中,我需要主视图控制器打开另一个视图控制器并成为它的委托,但另一个版本不使用该视图控制器并且不应该编译它的代码或尝试成为它的委托.我已经像这样设置了主视图控制器标题:

#ifdef VERSION2
#import "SpecialViewController.h"
#endif

@interface MainViewController : UIViewController <MPMediaPickerControllerDelegate, SpecialViewControllerDelegate> {
// etc.

#import 标记周围的条件可以正常工作,但是如何在一个版本中将此类声明为 SpecialViewControllerDelegate 而在另一个版本中不声明?

【问题讨论】:

标签: objective-c ios ios4 delegates


【解决方案1】:

只需使用#define 预处理器指令来更改版本之间的委托。 这是“VERSION2”的示例。

#ifdef VERSION2
#import "SpecialViewController.h"
#define ARGS PMediaPickerControllerDelegate, SpecialViewControllerDelegate 
#endif

@interface MainViewController : UIViewController <ARGS>

【讨论】:

  • 有趣,你如何处理需要实现为委托的方法? #ifdef 也围绕这些?
  • 我不确定我是否理解您问题的语法。作为委托实现的方法?也许您可以粘贴一个方法示例,这将帮助我确定回答这个问题的方法。
  • 某些协议要求您实现某些方法,例如UITableViewDataSource 要求你实现 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
  • 我明白了。是的,我会在这里使用#ifdefs。如果需要许多不同的版本,而不是 2,我会根据版本将其分成文件并更改 makefile 以使用基于版本号的适当文件。
  • 有趣的地方。我确实有一个引用 SpecialViewController 的方法(打开它的方法)并且在版本 1 中给出了错误,但我使用 ifdefs 在版本 1 中隐藏了该方法。在其他情况下,我认为离开不会有什么坏处那里的方法,它们将不会被使用。无论如何,这个解决方案对我有用——我现在可以构建两个版本——我很高兴我不必创建任何冗余代码。
【解决方案2】:

只要您不分配委托,您应该可以离开实现。您在 VERSION1 中的 SpecialViewController(如果您甚至在 V1 中有一个 SpecialViewController)将没有委托,因此它的调用将无处可去,这应该不会导致任何副作用。

#ifdef VERSION2
specialViewController.delegate = self;
#endif

如果这种方法不起作用,您似乎应该为每个目标设置不同的 MainViewController。

【讨论】:

  • 我不想在版本 1 中导入 SpecialViewController 标头,因为这会导致一堆其他代码不需要编译到该版本的应用程序中。我会更新我的问题以提及这一点。 (如果我不包含标头但保留接口声明,编译器将停止并显示错误“找不到 SpecialViewControllerDelegate 的协议声明。”)
猜你喜欢
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多