【问题标题】:iOS - access class method using targetsiOS - 使用目标访问类方法
【发布时间】:2017-08-31 06:00:08
【问题描述】:

我有以下代码:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyViewController" bundle:nil];
UINavigationController *navControllerInstance = [storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([MyViewController class])];

当我使用目标时,我的问题是 [MyViewController class] 返回 "MyTarget_2.MyViewController" 然后我的应用程序崩溃,因为 "'Storyboard (<UIStoryboard: 0x600001e65d80>) doesn't contain a view controller with identifier "

我有两个目标: MyTargetMyTarget_2,只有最后一个失败。

我不明白为什么 [MyViewController class] 返回 MyTarget.MyViewController。当我开始一个新项目时,这不会发生,只返回 MyViewController 。为什么会有这样的差异?

这似乎是相关的,因为我使用的是 swift+objective-c Calling NSStringFromClass on a Swift Class in Objective-C returns module mangled name

【问题讨论】:

  • 简单的解决方案将使用字符串@"MyViewController" 或为该字符串定义一些常量并使用它而不是从NSStringFromClass... 派生它。你有避免它的原因吗?
  • “当我使用目标时……”是什么意思?你能完成错误信息吗? “...不包含带有标识符的视图控制器...”?
  • @AndréSlotta 我的意思是,当我使用 MyTarget 编译时一切正常,但是当我使用 MyTarget_2 编译时,我崩溃了。
  • @VivekMolkar 你是对的,但我正在寻找一个优雅的解决方案,我认为这可能会成为市长的问题。
  • 您确定 all 故事板和类都包含在 all 目标中吗?错误消息中的 identifier 是什么?您没有完全粘贴它...

标签: ios xcode targets


【解决方案1】:

你可以像这样得到类名:

NSString *className = [[NSStringFromClass([MyViewController class]) componentsSeparatedByString:@"."] lastObject];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyViewController" bundle:nil];
UINavigationController *navControllerInstance = [storyboard instantiateViewControllerWithIdentifier:className];

并确保您的故事板 ID 应为 MyViewController

【讨论】:

  • 我遇到了同样的错误'NSInvalidArgumentException', reason: 'Storyboard (<UIStoryboard: 0x600000672200>) doesn't contain a view controller with identifier 'MyViewController''
【解决方案2】:

您是否在情节提要中为您的 ViewController 提供了 Identifier ?

您可以在 ViewController 的识别检查器部分中根据 Storyboard ID 提供它。

因为,

UINavigationController *navControllerInstance = [storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([MyViewController class])];

方法作用于 标识符 而不是 类名

【讨论】:

  • 你的标识符和你的班级名字一样吗?
【解决方案3】:

我认为你没有将那个特定的故事板复制到你的目标中。你可以验证它。点击目标。然后在构建阶段-> 复制捆绑资源。检查两个目标中是否存在情节提要文件。如果没有故事板,请单击 + 按钮添加该文件。清洁并运行。希望它有所帮助。

【讨论】:

  • 我已经检查并添加了它们。
  • 好的,您检查过是否单击了复选框以使用故事板 ID 吗?
  • 是的,检查到所有目标。
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2015-05-12
  • 2012-12-09
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多