什么是StoryBoard ID,我该如何使用?


110

我是IOS开发的新手,最近才开始使用Xcode 4.5。我看到,对于每个viewController,我都可以设置一些身份变量,包括情节提要ID。这是什么,我该如何使用?

在此处输入图片说明

我开始搜索stackoverflow,但找不到任何解释。我以为我不仅可以设置一些笨拙的标签来记住我的控制器,对吗?它有什么作用?

Answers:


132

情节提要ID是一个String字段,可用于基于该情节提要ViewController创建新的ViewController。可以从任何ViewController使用示例:

//Maybe make a button that when clicked calls this method

- (IBAction)buttonPressed:(id)sender
{
    MyCustomViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

   [self presentViewController:vc animated:YES completion:nil];
}

这将基于您命名为“ MyViewController”的故事板ViewController创建一个MyCustomViewController,并将其显示在当前View Controller上方

如果您在应用程序委托中,则可以使用

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                         bundle: nil];

编辑:斯威夫特

@IBAction func buttonPressed(sender: AnyObject) {
    let vc = storyboard?.instantiateViewControllerWithIdentifier("MyViewController") as MyCustomViewController
    presentViewController(vc, animated: true, completion: nil)
}

编辑Swift> = 3:

@IBAction func buttonPressed(sender: Any) {
    let vc = storyboard?.instantiateViewController(withIdentifier: "MyViewController") as! ViewController
    present(vc, animated: true, completion: nil)
}

let storyboard = UIStoryboard(name: "MainStoryboard", bundle: nil)

让我们尝试一下,以及如何获得self.storyboard
RTB

可以从任何ViewController访问self.storyboard。我现在将编辑答案,以便您看到
Eric

如果需要从我的AppDelegate或任何其他类访问它,该怎么办?
RTB 2012年

添加了另一个编辑,该编辑显示了如何从任何文件访问情节提要。
埃里克(Eric)

1
self.storyboard可以从故事板加载的任何视图控制器中进行访问。如果不是从情节提要中加载视图控制器,则该属性为nil。
rob mayoff 2012年

13

要添加到Eric的答案并针对Xcode 8和Swift 3进行更新:

情节提要ID确实符合其名称的含义:它可以标识。只是它可以识别情节提要文件中的视图控制器。情节提要通过这种方式知道哪个视图控制器是哪个。

现在,不要被名字弄糊涂了。故事板ID不能​​标识“故事板”。根据Apple的文档,情节提要“代表了应用程序全部或部分用户界面的视图控制器”。因此,当您具有下图所示的内容时,您将有一个名为Main.storyboard的情节提要,其中有两个视图控制器,可以为每个视图控制器赋予一个情节提要ID(其在情节提要中的ID)。

在此处输入图片说明

您可以使用视图控制器的情节提要ID实例化并返回该视图控制器。然后,您可以继续进行操作,并根据需要显示它。要使用Eric的示例,假设您要在按下按钮时显示一个标识符为“ MyViewController”的视图控制器,您可以通过以下方式进行操作:

@IBAction func buttonPressed(sender: Any) {
    // Here is where we create an instance of our view controller. instantiateViewController(withIdentifier:) will create an instance of the view controller every time it is called. That means you could create another instance when another button is pressed, for example.
    let vc = storyboard?.instantiateViewController(withIdentifier: "MyViewController") as! ViewController
    present(vc, animated: true, completion: nil)
}

请注意语法的更改。


黄色警告图标表示是由于第二个视图控制器没有入口点和/或ID。可以通过为其提供情节提要ID或将其连接到情节提要中的另一个视图控制器来解决此问题。这样,情节提要就知道如何到达并识别它。
Taiwosam

我无法找到情节提要ID字段,因此感谢您提供图片。这是在同一位置上的Xcode 9
艾萨克·博斯卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.