В предыдуще статье мы рассмотрели создание TabBarController и NavigationController программно в UIKit. В данной статье мы продолжим выполнение заданий и рассмотрим пункты 6 и 7. А Bar Button Item и Alert мы оставим на десерт и рассмотрим в следующей статье.

Добавьте PostViewController и настройка элементов для показа выбранного поста.

Чтобы у нас контроллеры не валялись, где не попадя давайте создадим папку Controllers и поместим в нее все файлы наших контроллеров. Так же в этой папку создаем новый UIViewController c именем PostViewController. Это будет наш контроллер для показа поста.

Первый делом, как просит нас задание, поменяйте заголовок у контроллера и цвет главной view. Для выполнения этого пункта у нас есть два пути:

1-й путь кустарно-топорный и к нему нет притензий. Просто внутри viewDidLoad прописываем все что нам надо:

override func viewDidLoad() {

        super.viewDidLoad()

        self.view.backgroundColor = .lightGray

        self.navigationItem.title = "Мой пост"

    }

2-й более элегантный и покажет в вас задатки будущего программиста использующего навыки ООП. Мы создаем метод в котором пишем то, что хотим сделать и вызываем этот метод внутри viewDidLoad :

 private func setupView() {

        self.view.backgroundColor = .lightGray

        self.navigationItem.title = "Мой пост"

        self.navigationItem.rightBarButtonItem = button

    }

С помощью backgroundColor мы задаем фоновый цвет - это может быть как сами view так и label или button.

А navigationItem.title утанавливает в верхней части TabBar заголовок. А если вы захотите заголовок сделать жирным и крупнее стоит в код добавить:

 self.navigationController?.navigationBar.prefersLargeTitles = true

Прекрасно, контроллер поста у нас есть. А как на него попасть?

Для этого нужно действие перехода и это действие нам дает кнопка.

Создаем в FeedViewController кнопу перехода на PostViewController:

    private lazy var button: UIButton = {

        let button = UIButton()

        button.backgroundColor = .blue

        button.layer.cornerRadius = 12

        button.setTitle("Перейти на пост", for: .normal)

        button.setTitleColor(.lightGray, for: .normal)

        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 24)

        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

        button.translatesAutoresizingMaskIntoConstraints = false

        return button

    }()

Кнопка у нас принадлежит данному классу и поэтому private и чтобы компилятор о ней постоянно не думал и не напрягался она у нас lazy.

И далее в переменной мы ее создаем как кнопку UIButton() . Методом backgroundColor задаем ей цвет. cornerRadius позволит нам скруглить углы и сделать ее более красивой. Так же создадим внутри кнопки текст для ее нормального состояния setTitle() и зададим тексту цвет setTitleColor(), если есть желание можем поменять размер и толщину шрифта titleLabel?.font. Отключам стандартные ограничения (констрейнты) translatesAutoresizingMaskIntoConstraints = false их мы зададим чуть ниже. И добавляем кнопке действие addTarget(self, action: #selector(buttonAction), for: .touchUpInside), а для чего мы ее собственно и создали.

Ах да... не забываем эту самую кнопку вернуть return button

Ну как говориться, пол дела сделано! Собственно теперь нам осталось добавить кнопку и установить ее положение на экране. Как я писал выше вы можете делать напрямую во viewDidLoad или создавать метод и его добавлять - мне нравится второй метод:

private func setupButton {

        self.view.addSubview(self.button)

        self.button.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -100).isActive = true

        self.button.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20).isActive = true

        self.button.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -20).isActive = true

        self.button.heightAnchor.constraint(equalToConstant: 50).isActive = true

    }

self.view.addSubview(self.button) добавляет нашу кнопку непосредственно во view , а далее мы привязываем кнопку к низу с отступом в 100 пикселей (т.к. отступ у нас идет вверх, то и знак "-". Это относится и к отступам справа), справа и слева, и задаем высоту.

Ну соотсветсвенно и сам метод перехода.

 @objc private func buttonAction() {

        let postViewController = PostViewController()

        self.navigationController?.pushViewController(postViewController, animated: true)

    }

А вот тут нам нужно создать сначала сам UIViewController на который мы хотим перейти и потом сделать переход (как говорят - запушить), предварительно завернув его в NavigationController

Ну и не забываем добавить методы в viewDidLoad

Создание и передача объектов между контроллерами

Данный пункт заслуживает внимания. Он научит работать с объектами и передавать их между контроллерами.

Для начала создадим папку Data и в ней создадим swift файл Post и внутри это файла создаем структуру Post со свойством title: String.

struct Post {

    var title: String

}

Далее мы создайте объект типа Post в FeedViewController и передаем его в PostViewController. Для это просто создаем переменную post со свойством Post сразу после создания самого класса FeedViewController

class FeedViewController: UIViewController {

    var post = Post(title: "Мой пост")

А для того, чтобы передать его в PostViewController некоторые подумают, что нужно создавать делегаты или писать замыкания. Нет, ничего не надо!

В предыдущем пункте мы уже в методеbuttonAction() создали UIViewController , тем самым обеспечив к нему доступ.

И сейчас, предварительно создав переменную для заголовка поста в PostViewController:

class PostViewController: UIViewController {

    var titlePost: String = "Anonymous"

  Мы просто в внутри метода buttonAction() присваиваем переменной titlePost значение переменной post :

 postViewController.titlePost = post.title

Осталось только в self.navigationItem.title заменить "Мой пост" на titlePost :

 self.navigationItem.title = titlePost

Ну вот и все! Сегодня вы научились создавать и настраивать кнопку, а также делать переход между ViewController. Получили вводну в Data - создание объектов и работу с ними.

А в следующей публикации мы создадим и настроим Bar Button Item и UIAlertAction.

Комментарии (2)


  1. boogiedimik
    09.03.2022 22:34

    Он научит работать с Data и делегировать ее между контроллерами.

    но то, что описано дальше ниже, никакое не делегирование же...


    1. MaksMai Автор
      10.03.2022 11:14

      Небольшая ошибочка. Поправил!