2015-02-02 5 views
0

До сих пор я использовал раскадровку для разработки моего пользовательского интерфейса. Теперь мне нужно настроить некоторые пользовательские интерфейсные элементы программным путем. Например закругленные края, ..Где я должен поместить код пользовательского интерфейса в Swift?

Я могу поместить этот код пользовательского интерфейса в viewDidLoad, но это не может быть правильным решением. Что касается концепции MVC, контроллер должен быть отделен от представления.

Итак, где я должен поместить весь код пользовательского интерфейса? Что такое лучшие практики?

+0

Я бы поставил его в '' viewDidLoad. – Cesare

+0

Но это разрушает шаблон дизайна MVC ... – Peter

+2

Вы можете создавать свои собственные классы для элементов, которые вы хотите настроить, и настроить их в представлении. Например. вам нужно 'UIView' с закругленными углами, поэтому создайте' JanView' (дочерний элемент 'UIView') и установите закругленные углы в методе' init ... ' –

ответ

1

В большинстве случаев вы должны поместить код пользовательского интерфейса в метод viewDidLayoutSubviews, потому что это происходит после того, как AutoLayout отсортировал элементы и разместил их правильно на представлении. Например, некоторый код в viewDidLoad не будет работать правильно, если вы использовали ограничения в Storyboard. ViewDidLoad работает до AutoLayout делает свою магию, поэтому все ваши высоты и ширины будут испорчены, если вы использовали эти значения в коде.

viewDidLayoutSubviews запускается после AutoLayout, поэтому лучше всего разместить его там, если вы никогда не используете значения фрейма, на которые мог повлиять AutoLayout. Тем не менее, по-прежнему хорошая практика поместить его в viewDidLayoutSubviews. Но так, как вы знаете, этот метод выполняется несколько раз при определенных действиях, например, просто нажав на UITextField, он снова запустится. Это становится проблемой, потому что это плохо для производительности и может запускать ненужный код. Например, вы можете добавить специальную границу под текстовым полем. Для этого вы можете создать новый слой и добавить его в текстовое поле, используя высоту и ширину. Поскольку он использует свойства рамки, он не будет работать в viewDidLoad, так как высота и ширина еще не были настроены с помощью AutoLayout. Это означает, что вам нужно будет поместить его в viewDidLayoutSubviews, где он будет продолжать получать вызовы после нажатия textField, по существу добавляя неограниченное количество границ.

Чтобы исправить эту проблему производительности, на самом деле лучше всего создать подкласс вашего элемента пользовательского интерфейса и настроить его в методе override drawRect. Вы можете получить доступ ко всем свойствам объекта там, и легко настроить все, что вы хотите. Затем в инспекторе Identity Inspector измените класс элемента на ваш подкласс. Это позволит Xcode автоматически делать все только при создании элемента и после завершения AutoLayout, что делает его наилучшим способом настройки пользовательского интерфейса.

Наконец, существует еще один способ настройки элементов. В Identity Inspector, если вы перейдете к атрибутам Runtime User Defined Runtime, вы можете легко добавлять свойства и редактировать значения там. Просто добавьте ключевой путь (имя атрибута), затем укажите тип значения, который он есть, и добавьте его! Это легко сделать, но для некоторых более сложных атрибутов проще всего сделать это в коде.

См. Рисунок ниже, чтобы узнать, где вы можете указать подкласс и добавить атрибуты времени выполнения.

Customizing in Storyboard

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