Skip to main content

UI и навигация

UI и навигация

Создавать UI и навигацию на iOS можно по-разному: можно использовать .storyboard, .xib или вообще описать все в коде.
В реальных проектах мы крайне редко будем использовать Storyboard и Seque, значительно чаще для верстки используется .xib а навигация происходит через код. Поэтому с ней нужно попрактиковаться.

Для начала, советуем вам ознакомиться со всеми подходами для навигации и верстки:

  • обратите внимание на памятки: Как удалить Storyboard и Как прейти от SwiftUI к UIKit, они могут пригодиться вам в будущем.
  • статья-сравнение .xib, .storyboard и code для UI
  • статья о плюсах и минусах .storyboard
  • видео о том, как добавить NavigationController программно
  • статья про навигацию внутри NavigationController
  • второй пункт статьи про настройку NavigationBar
  • статья про то, как создавать .xib и ViewController и связывать их друг с другом
  • Чтобы сразу создать связанные .xib и .swift файлы, нужно выбрать типом создаваемого файла Cocoa Touch Class и в следующем меню выбрать пункт Also create xib file и указать родителя нашего нового контроллера

CustomView

CustomView - отдельная вьюха для использования на нескольких экранах.
Например, в случае отсутствия интернет-соединения в приложении нужно показать какую-нибудь картинку, надпись - "Нет интернета" и кнопку - "Refresh". Поскольку интернет может пропасть на любом экране приложения - нам нужно добавить все эти вьюхи (картинку, поле и кнопку) на каждый экран - такое откровенное дублирование захламляет код и сильно усложняет его поддержку.
Вместо этого мы можем сверстать отдельную ErrorView и подключить ее на все экраны, где она нужна.

Instructions

Создайте новую View и добавьте на неё какую-нибудь вьюху, например - UILabel. create-view.png

Создайте новый Swift File со следующим содержанием:

class MyCustomView: UIView {

@IBOutlet weak var sampleDescriptionLabel: UILabel!

override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}

func commonInit() {
let viewFromXib = Bundle.main.loadNibNamed(String(describing: type(of: self)), owner: self, options: nil)!.first as! UIView
viewFromXib.frame = self.bounds
addSubview(viewFromXib)
}
}

Укажите Class для File's Owner вьюхе, которую вы только что создали set-filesowner-class.png

Теперь добавьте новую View на ViewController и укажите ей класс - MyCustomView add-view-to-controller.png

Кастомная вьюха готова, мы можем обращаться ко всем ее публичным аутлетам и настраивать как нам нужно use-custom-view.png

Подключение сторонней View

Помимо своей собственной кастомной вьюхи, может понадобиться использовать в .xib вьюху из другой библиотеки, например - MDCActivityIndicator для индикатора загрузки.
Делается это точно также, как и с кастомной вьюхой:

  1. Добавьте View в xib
  2. Укажите класс для View
  3. Свяжите View c ViewController при помощи IBOutlet
  4. При необходимости, настройте View в коде

Особенности UITableViewController

На практике UITableViewController не используется, потому что таблица лежит в корне и это не позволяет добавлять другие вью на экран. Чтобы убедиться в этом, создайте контроллер-наследник UITableViewController и попробуйте добавить несколько вьюшек

Подход для решения задачи, когда на экране должна быть таблица и другие элементы:

  • создать обычный UIViewController
  • создать UITableView и задать ей в коде datasource
  • создать остальные, необходимые на экране элементы

Практическое задание

Создайте проект, где будет 2 экрана, объединенные UINavigationController.
Стартовый экран будет просто с кнопкой по центру, при нажатии будем переходить на второй. На втором - таблица. Попрактикуйтесь в разных способах создания экранов:

  • стартовый создайте используя одинаковые имена для .xib и .swift файлов
  • второй экран создайте используя разные имена для .xib и .swift файлов, свяжите их вручную