В предыдуще статье мы рассмотрели создание 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
.
boogiedimik
но то, что описано дальше ниже, никакое не делегирование же...
MaksMai Автор
Небольшая ошибочка. Поправил!