【问题标题】:How to show my cocoa touch framework storyboard screen?如何显示我的可可触摸框架故事板屏幕?
【发布时间】:2015-07-29 01:21:16
【问题描述】:

我创建了一个带有故事板的简单 Cocoa 触控框架。在我的框架中,我有一个 MainViewController.swift 视图控制器。 我创建了一个新的单视图项目,导入了我的框架并尝试加载我的框架视图控制器,但我得到了黑屏。我也不知道为什么。

我尝试使用以下代码加载框架:

let frameworkScreen : UIViewController = MainViewController()
    self.presentViewController(frameworkScreen, animated: true, completion: nil)

【问题讨论】:

  • 问题是MainViewController() 创建了一个视图控制器,但没有告诉这个控制器从哪里获取视图。所以那个视图是空的和黑色的。你说你的框架中有一个故事板,但你没有使用那个故事板。
  • 谢谢,但我如何使用我的故事板?
  • 我给你看,等一下。
  • 非常感谢!我没有为我的问题找到任何解决方案..
  • 回答完毕。我想你会发现这很好地解决了这个问题,我已经试着解释了原因。

标签: ios iphone swift cocoa-touch


【解决方案1】:

如果您的框架名称是MyFramework,故事板名称是Main,带有故事板ID为vc的视图控制器

if let urlString = NSBundle.mainBundle().pathForResource("MyFramework", ofType: "framework", inDirectory: "Frameworks") {
  let bundle = (NSBundle(URL: NSURL(fileURLWithPath: urlString)))
  let sb = UIStoryboard(name: "Main", bundle: bundle)
  let vc = sb.instantiateViewControllerWithIdentifier("vc")
  self.showViewController(vc, sender: nil)
}

我已经使用 cocoapods 引入了框架。

Swift 5.5、Xcode 13 和 iOS 15

if let urlString = Bundle.main.path(forResource: "MyFramework", ofType: "framework", inDirectory: "Frameworks") {
   let bundle = (Bundle(url: NSURL(fileURLWithPath: urlString) as URL))
   let sb = UIStoryboard(name: "Main", bundle: bundle)
   let vc = sb.instantiateViewController(withIdentifier: "vc")
   self.show(vc, sender: nil)
}

【讨论】:

  • 我对这种方法有疑问。当我有“vc”的自定义类时,它没有加载:(
【解决方案2】:

您需要通过在框架中的情节提要实例化视图控制器来加载视图控制器

方法如下。首先是一些初始条件:

  • 假设您的框架名为 Coolness。

  • 假设您的框架的故事板名为 CoolnessStoryboard.storyboard

  • 假设您的框架有一个名为 CoolnessViewController 的 public 类。

  • 假设 CoolnessStoryboard 有一个场景,其视图控制器是 CoolnessViewController,这是它的初始视图控制器。

然后在你的主代码中你会import Coolness 并且,为了从情节提要中展示你的 CoolnessViewController,你会说:

let s = UIStoryboard (
    name: "CoolnessStoryboard", bundle: NSBundle(forClass: CoolnessViewController.self)
)
let vc = s.instantiateInitialViewController() as! UIViewController
self.presentViewController(vc, animated: true, completion: nil)

注意这里的策略。从目标向后工作。我们需要故事板中的 CoolnessViewController 实例。为此,我们需要对该故事板的引用。为此,我们需要确定该故事板。如何?我们可以通过名称和它所在的包来识别它。但是我们如何识别那个包呢?我们可以通过该捆绑包中的类来识别捆绑包。我们这样一个类,因为我们已经导入了框架(import Coolness)并且那里的类是public(所以我们可以说)。

【讨论】:

  • 所以我尝试了你的代码,但我得到了这个:由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'在捆绑包 NSBundle 中找不到名为'Storyboard'的故事板...我的框架名称是 MyTestFramework(我导入了这个),我的框架故事板名称是 Storyboard.storyboard,我的框架视图控制器是 MainViewController
  • 哦,我找到了解决方案!我的框架故事板中有一个导航控制器...
  • 是的,我的回答向您展示了该技术,但将其应用于您的具体情况取决于您!这就是为什么我如此准确地描述了我的“初始条件”。
  • Xcode 13 & iOS 15 中运行良好,而且解释非常好...
【解决方案3】:

我遇到了同样的问题。这是我经过一番研究后解决的方法:

1 - 我有一个名为“Messenger.framework”的框架

2 - 在其中,我有一个名为“Messenger.Storyboard”的故事板文件

3- 我的初始视图控制器是一个 UINavigationController,带有一个 rootViewController 和我的 ChatController。

这就是我框架的聊天 UIViewController 的呈现方式:

- (void)presentChatController
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Messenger"
                                                         bundle:[NSBundle bundleForClass:ChatController.class]];

    ChatController *controller = [storyboard instantiateViewControllerWithIdentifier:@"Chat"];
    [self.navigationController pushViewController:controller animated:YES];
}

希望对你有帮助。

【讨论】:

  • 在哪里调用 presentChatController ?我在 viewDidAppear() 中调用了这个方法,但它被调用了多次。
  • 当你想展示新的控制器时调用它。例如,当用户按下按钮时,您可以调用它。
猜你喜欢
  • 2020-01-15
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多