Swift 4 - метод селектора NotificationCenter AddObserver не вызывается при публикации уведомления - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть контроллер представления и внутри контроллера представления настраиваемое представление таблицы и настраиваемые ячейки представления таблицы.Внутри этих ячеек у меня есть ячейки представления коллекции и представления коллекции ... По сути, мой projects: [Project] = [] в моем viewController заполняется объектами Project из Firebase и заполняет ячейки tableview и tableview.Я хочу получить свойство массива из этих проектов и заполнить ячейки представления коллекции в ячейках таблицы.

Я пытаюсь передать данные проекта в ячейки представления коллекции с помощью NotificationCenter.default и публикациимассив projects с уведомлением.Затем в моем ProjectTableViewCell.swift , где я настраиваю свои представления коллекций и ячеек коллекций, я добавляю еще одну var projects: [Project] = [], которую я пытаюсь заполнить, используя наблюдатель уведомлений и вызывая функцию (populateProjects(notification:)), которая захватываетuserInfo данные из уведомления и установка массива projects с данными.

Моя проблема в том, что селектор метода populateProjects(notification:) не вызывается ... Я установилточки останова, и они достигают метода addObserver, но селектор не вызывается.Я также устанавливаю параметр object в методе addObserver и post на nil , чтобы любой объект мог получать уведомление ... Я уже просматривал эти сообщения и реплицировал то, что они сделали, но мойселектор по-прежнему никогда не вызывается.Я что-то упустил?Пожалуйста, помогите, заранее извините за длинный пост !!

PS: Я также был бы признателен за некоторые отзывы относительно моего подхода к вложению представления коллекции в ячейки табличного представления.Я посмотрел на многие посты, которые пытались это сделать, и именно этот метод имел смысл.Но в основном я хочу, чтобы этот материал уведомлений работал.

просмотр стека сообщений: - NSNotificationCenter addobserver не вызывает метод селектора в SWIFT - NotificationCenter obersever не вызывается в swift4 - Swift 4 - Центр уведомлений проблема addObserver

мой ViewController.swift выглядит так:

class HomeViewController: UIViewController {

    @IBOutlet weak var homeTableView: UITableView!

    var projects: [Project] = []
    var db: Firestore!
    let nc = NotificationCenter.default
    let projectsNotification = Notification.Name(rawValue: "projectsDataNotification")

    override func viewDidLoad() {
        super.viewDidLoad()

        homeTableView.delegate = self
        homeTableView.dataSource = self
        homeTableView.separatorStyle = .none

        db = Firestore.firestore()

        db.collection("projects").getDocuments { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {
                    let project = Project(id: document.documentID, documentData: document.data())!
                    print(document.data())
                    self.projects.append(project)
                }
                self.homeTableView.reloadData()
            }
        }
        nc.post(name: projectsNotification, object: nil, userInfo: ["projects": projects])
        homeTableView.reloadData()
    }
}

мой ProjectTableViewCell.swift выглядит так:

class ProjectTableViewCell: UITableViewCell {
    @IBOutlet private weak var collectionView: UICollectionView!

    var projects: [Project] = []
    let nc = NotificationCenter.default
    let projectsNotification = Notification.Name(rawValue: "projectsDataNotification")

    override func awakeFromNib() {
        super.awakeFromNib()
        collectionView.dataSource = self
        collectionView.delegate = self

        let flowLayout = UICollectionViewFlowLayout()
        flowLayout.scrollDirection = .horizontal
        flowLayout.minimumLineSpacing = 10.0
        flowLayout.minimumInteritemSpacing = 10.0
        collectionView.collectionViewLayout = flowLayout

        nc.addObserver(self, selector: #selector(self.populateProjects), name: projectsNotification, object: nil)
    }

    @objc func populateProjects(notification: Notification) {
        let userInfo: [String: Any] = notification.userInfo as! [String : Any]
        let projectsData = userInfo["projects"] as! [Project]
        self.projects = projectsData

        for project in projectsData {
            print("TEST projectsData TableCell: \(project.title)")
        }
    }
}

extension ProjectTableViewCell: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return projects[section].needs.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "needsCell", for: indexPath)

        let cellLayer = cell.layer
        cellLayer.borderWidth = 0.75
        cellLayer.cornerRadius = 6

        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 75, height: 30)
    }  
}
...