【问题标题】:Navigating from one ViewController to a new ViewController with a different Storyboard从一个 ViewController 导航到具有不同 Storyboard 的新 ViewController
【发布时间】:2021-01-31 06:49:26
【问题描述】:

我创建了一个应用程序,其中有两组 ViewControllers/Storyboards。我想从原来的 ViewController/Storyboard 出发,然后在按下按钮后加载另一个 ViewController/Storyboard。我尝试了不同的方法,例如this 答案,但无法弄清楚。

这是第一个 ViewController 的代码:

import UIKit

class HomeController: UIViewController {

@IBAction func enterCottageBuddyApp(_ sender: Any) {
    let storyBoard : UIStoryboard = UIStoryboard(name: "Home", bundle:nil)

    let nextViewController = storyBoard.instantiateViewController(withIdentifier: "CottageTabsView") as!
    CottageTabsController
    self.present(nextViewController, animated:true, completion:nil)
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}


}

这里是故事板:

这是 Main.storyboard,但我决定将其重命名为 Home.storyboard(我已更新 info.plist 以反映此更改并且此故事板正确加载)。

这是我自己创建的单独的 ViewController (UITabBarController):

import UIKit

class CottageTabsController: UITabBarController {

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

}

借助它的 Storyboard,我还为标签栏控制器添加了自己:

我已将这些添加到单独的文件中,以获得更清晰的文件层次结构(例如,为登录页面提供故事板和视图控制器,以及在用户进入应用程序时使用新的故事板和标签栏控制器)。当我单击主页故事板上的“输入应用程序”按钮时,应用程序崩溃并出现以下错误: 'NSInvalidArgumentException', reason: 'Storyboard (<UIStoryboard: 0x600002901f80>) doesn't contain a view controller with identifier 'CottageTabsView''

我确保在检查器中添加 Storyboard ID 和 Restoration ID 并将它们包含在按钮的操作方法中,但无论我尝试什么似乎都无法使其工作。我希望应用程序从 Home.storyboard 和 HomeController 加载到 CottageTabsController 和 CottageTabs.storyboard。

谢谢!

【问题讨论】:

  • 可以给项目导航器截图吗?
  • 另外,你还在用HomeController吗?我在故事板中没有看到它
  • @aheze 我已经添加了它,一旦我点击HomeController 上的按钮,我想改用CottageTabBarsController,就像从一个导航到另一个。抱歉,如果我的条款不正确,我是 iOS 新手,正在努力改进它!
  • Np。尝试将Home 替换为CottageTabs,因为您将CottageTabsController 移到了它自己的情节提要中。请参阅下面的答案

标签: ios swift xcode storyboard


【解决方案1】:

CottageTabsController 在它自己的故事板中,所以你需要将UIStoryboard(name: "Home", bundle: nil) 替换为UIStoryboard(name: "CottageTabs", bundle: nil)

@IBAction func enterCottageBuddyApp(_ sender: Any) {
    let storyBoard : UIStoryboard = UIStoryboard(name: "CottageTabs", bundle:nil) /// <- Different storyboard!

    let nextViewController = storyBoard.instantiateViewController(withIdentifier: "CottageTabsView") as!
    CottageTabsController
    self.present(nextViewController, animated:true, completion:nil)
}

【讨论】:

  • 这就是问题所在,使用新的ViewController 我现在知道我必须实例化该故事板。另一个问题,当我单击按钮时,我仍然在调试器中看到旧的ViewController 仍然存在于视图层次结构中并且对用户可见。有没有办法加载新的ViewController 并且只有那个存在?
  • 你可以看看这个answer,但通常你可以保留旧的。
  • 我实际上在下一个控制器上为modalPresentationStyle 使用了fullscreen 选项。在层次结构调试器中,HomeController 似乎不再存在,因此资源被保存在那里而不丢弃它!再次感谢!
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多