У меня есть контроллер представления и внутри контроллера представления настраиваемое представление таблицы и настраиваемые ячейки представления таблицы.Внутри этих ячеек у меня есть ячейки представления коллекции и представления коллекции ... По сути, мой 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)
}
}