2016-02-06 7 views
1

Я развиваю игру, и я сохраняю дизайн уровня для конца. Во всяком случае, я сейчас здесь и сталкиваюсь с проблемами. Я хотел бы использовать один и тот же раскадровки для всех уровней, но просто измените класс раскадровки на другой контроллер представления. Я предполагаю, что наличие 50+ раскадровки в вашем проекте не очень хорошо, исправьте меня, если я ошибаюсь.Программно изменить класс раскадровки в Swift

Прямо сейчас это «образец» кода, который у меня есть, чтобы дать представление о том, что я хочу делать.

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 контроллеров представлений, а Id - как пользовательский класс, найденный в инспекторе идентификации, чтобы перейти на соответствующий уровень. –

ответ

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

Если у вас есть общий пользовательский интерфейс, который имеет различную логику в зависимости от некоторого состояния, вы можете отделить различную логику как можно большего количества классов и просто использовать контроллер представления IB в качестве канала для общих элементов пользовательского интерфейса. Класс контроллера вида, который вы указали в IB, просто будет иметь IBOutlets и IBActions плюс переменную с соответствующим экземпляром класса «логика». При инициализации контроллеру вида нужно будет только создать соответствующий тип для логического класса (хорошее место для использования фабричного шаблона) и связать выходы с объектом или просто действовать как делегат.

Смежные вопросы