Как передать данные из заголовка представления коллекции в представление коллекции

#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?