使用不同的 Storyboard 从一个 ViewController 导航到一个新的 ViewController

Navigating from one ViewController to a new ViewController with a different Storyboard

我创建了一个应用程序,其中有两组 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.
}

}

通过故事板,我也为标签栏控制器添加了自己:

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

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

谢谢!

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)
}