#swift #uicollectionview #header
#быстрый #uicollectionview ( пользовательский просмотр ) #заголовок
Вопрос:
У меня есть представление коллекции с заголовком и телом.
В заголовке есть кнопка, которая увеличивает дату на 1 месяц.
Мне нужна кнопка в заголовке, чтобы также увеличить дату в теле представления коллекции.
Вот базовый код:
class ExampleViewController: UIViewController, UICollectionViewDelegate,UICollectionViewDataSource {
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.refresh), name: NSNotification.Name(rawValue: "dateUpdated"), object: nil)
}
@objc private func refresh() {
collectionView.reloadData()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return categories.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ExampleCell", for: indexPath) as! ExampleCell
cell.configureCell(with: indexPath)
return cell
}
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "ExampleHeader", for: indexPath) as! ExampleHeader
header.configureHeader()
return header
}
}
class ExampleHeader: UICollectionReusableView {
var selectedDate = Date()
func configureHeader() {
//Configure stuff
}
@IBAction func addMonthButtonTapped(_ sender: UIButton) {
selectedDate = Calendar.current.date(byAdding: .month, value: 1, to: selectedDate)!
//Tell the ExampleCell class to add a month to its selectedDate property.
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "dateUpdated"), object: nil)
}
}
class ExampleCell: UICollectionViewCell {
var selectedDate = Date()
func configureCell(with indexPath: IndexPath) {
//Configure stuff
}
}
Использую ли я метод делегирования / протокола для передачи данных?
protocol DateSwitcherDelegate {
func switchDate(with date: Date)
}
class ExampleHeader: UICollectionReusableView {
var dateSwitcherDelegate: DateSwitcherDelegate!
@IBAction func leftButtonPressed(_ sender: UIButton) {
selectedDate = Calendar.current.date(byAdding: .month, value: -1, to: selectedDate)!
dateSwitcherDelegate.switchDate(with: selectedDate)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "dateUpdated"), object: nil)
}
}
extension ExampleCell: DateSwitcherDelegate {
func switchDate(with date: Date) {
selectedDate = date
}
}
Я попытался это сделать, но получил:
«Неустранимая ошибка: неожиданно обнаружено значение nil при неявном развертывании необязательного значения: file»
Правильно ли я поступаю по этому поводу? Или я должен использовать класс ExampleViewController для передачи данных?
Я новичок в программировании, и это мой первый проект.
Заранее спасибо за помощь!
Редактировать: я работаю над созданием модели для даты, как предложил @VadimBelyaev. Вот что у меня есть на данный момент.
import Foundation
class MonthToAdjust {
var date = Date()
init(date: Date) {
self.date = date
}
func increaseDateByAMonth() {
date = Calendar.current.date(byAdding: .month, value: 1, to: date)!
}
func decreaseDateByAMonth() {
date = Calendar.current.date(byAdding: .month, value: -1, to: date)!
}
}
Как мне получить доступ к переменной в ViewController? Как мне обновить дату в модели? Спасибо.
Комментарии:
1. Хорошее начало и поздравляю с первым проектом! Боюсь, вы пытаетесь решить не ту проблему. Два представления, обменивающиеся данными, могут привести к недостижимому коду. Рассмотрите возможность создания единого объекта модели, который будет взаимодействовать с двумя представлениями. Передайте ссылку на вашу модель обоим представлениям, и они попросят модель обновиться в ответ на действия пользователя. Используйте шаблон делегирования вместо уведомлений, чтобы представления могли реагировать на изменения модели. Избегайте использования какой-либо бизнес-логики в представлениях (например, увеличения даты на один месяц — подобные вещи лучше включать в модель). Удачи!
2. Спасибо за помощь @VadimBelyaev! Не могли бы вы предоставить пример кода, чтобы описать, о чем вы говорите? Похоже, мне нужно создать другой класс с переменной date?