【问题标题】:Access view controller from referencing storyboard从引用故事板访问视图控制器
【发布时间】:2017-04-18 12:30:18
【问题描述】:

据我所知,引用故事板可用于制作具有相同故事板引用的多个故事板。如果所有视图控制器层次结构都通过 segue 连接,则它可以工作。

我想知道如何使用引用故事板而不在视图控制器之间进行分隔,因为一个视图控制器可能以多种方式使用,或者可能需要使用新引用故事板中的故事板标识符访问视图控制器。

请告诉我,我想在没有 segue 的情况下使用引用故事板的视图控制器。

【问题讨论】:

  • 使用故事板ID
  • 我试过了。但它崩溃了。
  • 因为在 main.storyboard 中找不到特定的视图控制器。
  • 你能用崩溃报告更新你的问题吗
  • 当我想直接从引用故事板访问视图控制器时,我遇到了这个崩溃“不包含标识符为 'SpecificVC' 的视图控制器”

标签: ios uistoryboard uistoryboardsegue


【解决方案1】:

你可以这样做......

@IBAction func tapButtonToShowOtherController(_ sender: Any?) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    //storyboard identifier set in storyboard "userSB"
    let aVC = storyboard.instantiateViewController(withIdentifier: "userSB") as? AViewController          
    aVC?.udelegate = self
    self.present(aVC!, animated: true, completion: nil)
}

【讨论】:

  • 它会使应用程序崩溃。
  • 终端告诉你什么...为什么它崩溃了?
【解决方案2】:

在身份检查器中将 id 提供给情节提要,例如“ViewController_id”

MyCartViewController* destVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MyCartViewController_id"];
[self.navigationController pushViewController:destVC animated:YES];

【讨论】:

  • 它会使应用程序崩溃。
  • 这段代码有什么问题。你能解释一下吗?
【解决方案3】:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"myViewCont"];

【讨论】:

  • 感谢@Jagveer,但我想从 Main.storyboard 访问所有视图控制器,并且我有多个引用故事板而不是多个故事板。
  • 但您一次只能调用一个视图控制器
【解决方案4】:

从故事板中选择您的视图控制器并选择身份检查器给故事板ID任何你想要的

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"your storyboard name" bundle:nil];
    MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"your storyboard id"];

我在这里下载了示例https://www.raywenderlich.com/115697/ios-9-storyboards-tutorial-whats-new-in-storyboards

他们使用故事板参考作为segue。在这里我修改了以下内容:

1.select Checklists.stoaryboard

2.删除ChecklistDetailViewController segue。

3.选择 ChecklistsViewController.swift

4.添加以下代码:它的工作没有segue

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let storyboard = UIStoryboard(name: "ChecklistDetail", bundle: nil)
        let aVC = storyboard.instantiateViewController(withIdentifier: "ChecklistDetailViewController") as? ChecklistDetailViewController
        aVC?.checklist = checklists[indexPath.row]
        navigationController?.pushViewController(aVC!, animated: true)


    }

5.comment prepare(for segue: UIStoryboardSegue, sender: Any?) 方法。

这里我明白了:

在使用时,storyboard reference 需要提及ReferenceID

然后您可以通过分别给出 stoarboard namestoryboardId

来获取 viewcontroller

【讨论】:

  • #karthikeyan 它适用于单个故事板,我有多个引用故事板,并使用主故事板访问 vc。
  • 多引用故事板是什么意思?
  • 我的意思是说我有一个 Main.storyboard 和其他 2 个从 Main.storyboard 引用的故事板。请在此处详细阅读相同的内容raywenderlich.com/115697/…
  • 谢谢,#karthikeyan,我会再次检查并通知您。
  • 是的,但是在 didSelectRowAt 方法中,您明确添加了情节提要的“ChecklistDetail”名称,我知道这是可能的,我想使用 didSelectRow 方法从 main.storyboard 访问此视图控制器,您提到过。而且我知道如果我从 main.storyboard 引用视图控制器,它将起作用,如果没有该引用该怎么办。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多