2016-02-06 56 views
1

我正在开发一款游戏,并且我一直在为最终节省关卡设计。无论如何,我现在在这里,遇到问题。我想要为所有关卡使用相同的故事板,但只需将故事板的类更改为不同的视图控制器即可。我假设在你的项目中有50多个故事板不是一件好事,如果我错了,请纠正我。在Swift中以编程方式更改Storyboard的类

现在,这是我的“示例”代码,只是为了了解我想要做什么。

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

我不清楚你在这里试图做什么,或者你认为改变“故事板的类”意味着什么。你为什么认为你需要一些50+视图控制器?他们有什么不同,你想重复什么?他们都有共同的观点,在这种情况下,为什么你需要这么多的控​​制器? – Jonah

+0

据我了解你的问题,我认为你不需要每个级别的新类,你需要一个新的视图控制器实例。 – Adam

+0

所有级别都有不同的功能,但可以使用相同的故事板。所以我有50个视图控制器,并且像身份检查器中发现的自定义类一样更改为相应的级别。 –

回答

0

好的程序员会尽可能地重用东西。如果你的关卡基本相同,只有视图结构/逻辑的一些差异,那么我建议让一个故事板指向一个视图控制器,例如“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:看起来你的故事板文件,看看是否有与该标识符的视图控制器对象,并将其返回。此返回的视图控制器也将与您在身份检查器的自定义类部分中指定的类相同。

无论您使用哪种技巧,请确保在故事板中设置自定义类。

0

如果你有一个共同的UI,根据某些条件具有不同的逻辑,你可以根据需要在不同的类中分离不同的逻辑,而仅仅使用IB的视图控制器作为通用用户界面元素的通道。您在IB中指定的视图控制器类将只包含IBOutlets和IBActions以及一个带有“逻辑”类的适当实例的变量。在初始化时,视图控制器只需要为逻辑类实例化适当的类型(一个使用工厂模式的好地方),并将这些插口连接到对象或者仅仅充当委托。

相关问题