Я создаю приложение iOS с RxSwift и RxDataSource, используя архитектуру VIPER. Я хочу изменить содержимое UICollectionView по мере изменения значения ведущего (поскольку пользователь ввел некоторые буквы в searchBar, collectionView должен отображать профиль всех пользователей, который начинается с букв), но это не работает как Я этого хотел.
При попытке использовать функцию debug()
значение presenter.section
в ViewController (которое содержит содержимое CollectionView) изменяется после того, как я набрал несколько букв в строке поиска. Однако collectionView не отражает изменения. Вот основные части кода.
код ViewController
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
self.presenter.section
.drive(self.searchedFriendsCollectionView.rx.items(dataSource: self.dataSource))
.disposed(by: self.disposeBag)
self.searchedFriendsCollectoinView.rx
.setDelegate(self)
.disposed(by: self.disposeBag)
}
код ведущего
init(view: SearchFriendsViewInterface, interactor:
SearchFriendsInteractorInterface, wireframe:
SearchFriendsWireframeInterface) {
self.view = view
self.interactor = interactor
self.wireframe = wireframe
let allUsers = self.interactor.allUsers().asObservable()
self.view.searchText
.debounce(0.5)
.filterNil()
.distinctUntilChanged()
.filterEmpty()
.asObservable()
.flatMap { text -> Observable<[SearchFriendsSection]> in
// get all users starting with "text"
allUsers.mapSections(query: text)
}
.bind(to: self.section)
.disposed(by: self.disposeBag)
}
extension Observable where E == [User] {
fileprivate func mapSections(query: String) -> Observable<[SearchFriendsSection]> {
return self.map {
$0.filter { $0.userDisplayName.hasPrefix(query) || $0.username.hasPrefix(query) }
}
.map { users -> [SearchFriendsSection] in
let items = users.map { user in
SearchFriendsItem(icon: user.profileImageURL, displayName: user.userDisplayName)
}
return [SearchFriendsSection(items: items)]
}
}
}
Как я определил dataSource
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
self.searchedFriendsCollectoinView = UICollectionView(frame: .init(), collectionViewLayout: self.searchedFriendsCollectionViewFlowLayout)
let dataSource = RxCollectionViewSectionedReloadDataSource<SearchFriendsSection> (configureCell: {(_, collectionView, indexPath, item) -> UICollectionViewCell in
collectionView.register(SearchFriendsCell.self, forCellWithReuseIdentifier: "SearchFriendsCell")
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SearchFriendsCell", for: indexPath) as! SearchFriendsCell
cell.item = item
return cell
})
self.dataSource = dataSource
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
- ViewController имеет экземпляр Presenter, а у Presenter есть экземпляр с именем
section
. Этотsection
содержит список пользователей, чье имя пользователя начинается с определенных букв.
Не могли бы вы мне помочь? Если я оставил что-то неясным, пожалуйста, дайте мне знать в комментарии.
Обновление: вывод debug()
2019-02-01 10:22:27.610: values -> subscribed
2019-02-01 10:22:27.611: values -> Event next([])
--after typed in some letters in the searchBar--
2019-02-01 10:22:41.494: values -> Event
next([AppScreen.SearchFriendsSection(items:
[AppScreen.SearchFriendsItem(....),
AppScreen.SearchFriendsItem(....),
AppScreen.SearchFriendsItem(....)])])
debug()
непосредственно перед привязкой/приводом/подпиской на сам источник данных табличного представления. Каков его выход? - person Daniel T.   schedule 29.01.2019self.dataSource
не изменился даже после того, как я набрал несколько букв, он был утилизирован. Но имеет лиself.dataSource
какое-то отношение к содержимому UICollectionView? - person joey22   schedule 30.01.2019self.dataSource
не изменился (потому что этоlet
), но когда я поставилdebug()
прямо передdrive()
в ViewController, был создан новый элемент. У вас есть идеи, почему содержимое CollectionView не меняется? - person joey22   schedule 31.01.2019.debug("values")
между строкойself.presenter.section
и строкой.drive(self.searchedFriendsCollectionView.rx.items(dataSource: self.dataSource))
в контроллере представления и опубликуйте вывод этой отладки в своем вопросе. - person Daniel T.   schedule 31.01.2019collectionView.dequeueReusableCell...
. Звонят? - person Daniel T.   schedule 01.02.2019