我正在开发一款游戏,我一直在为最终节省关卡设计。无论如何,我现在在这里遇到问题。我想为所有级别使用相同的故事板,但只需将故事板的类更改为不同的视图控制器。我假设在你的项目中有50多个故事板不是一件好事,如果我错了,请纠正我。
现在这是"样本"我的代码,只是想知道我想做什么。
let storyboard = UIStoryboard(name: "Main", bundle: nil)
nextViewConroller = storyboard.instantiateViewControllerWithIdentifier("levelStoryboard")
storyboard.class = "Level" + String(currentLevel) + "Controller" // Purely concept code - does not work.
presentViewController(nextViewConroller, animated: true, completion: nil)
答案 0 :(得分:2)
优秀的程序员将尽可能地重用事物。如果您的级别基本相同,视图结构/逻辑只有一些差异,那么我建议将一个故事板指向一个视图控制器,例如“LevelViewController”。然后你可以有一些配置函数来配置这个控制器的特定级别,这是一个很好的地方,在prepareForSegue:
func prepareForSegue(segue:UIStoryboardSegue) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
nextViewConroller = storyboard.instantiateViewControllerWithIdentifier("levelStoryboard") as! LevelViewController
nextviewcontroller.configureForLevel(2)
}
但是,如果你必须使用不同的视图控制器,因为每个级别都完全不同,只需传递你想要使用的新类的标识符:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
nextViewConroller = storyboard.instantiateViewControllerWithIdentifier("level_0") as! Level0ViewController
请记住,instantiateViewControllerWithIdentifier:查看您的storyboard文件,看看您是否有一个带有该标识符的视图控制器对象,并将其返回。此返回的视图控制器也将与您在身份检查器的自定义类部分中指定的类相同。
无论使用哪种技术,请确保在故事板中设置自定义类。
答案 1 :(得分:0)
如果您的公共UI根据某些条件具有不同的逻辑,您可以根据需要将多个类中的变化逻辑分开,并仅使用IB的视图控制器作为公共用户界面元素的通道。您在IB中指定的视图控制器类将只具有IBOutlets和IBActions以及具有“逻辑”类的适当实例的变量。在初始化时,视图控制器只需要为逻辑类(一个使用工厂模式的好地方)实例化适当的类型,并将出口链接到对象或仅作为委托。