我是IOS开发的新手,最近刚开始使用Xcode 4.5。我看到每个viewController都可以设置一些身份变量,包括故事板ID。这是什么以及如何使用它?
我开始在stackoverflow上搜索,但找不到任何解释。 我认为这不仅仅是一些愚蠢的标签,我可以设置为记住我的控制器吗?它做了什么?
答案 0 :(得分:129)
故事板ID是一个String字段,您可以使用该字段创建基于该Storyboard 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
之上如果您在app app delegate中,则可以使用
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
编辑:Swift
@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)
答案 1 :(得分:11)
添加到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)
}
请注意语法上的更改。