# #ios #swift #xcode #viewcontroller #firebase-dynamic-links
Вопрос:
У нас было разработанное для нас приложение, но мы хотим расширить его функциональность. Приложение имеет несколько функций, но в данном контексте это приложение свойств, подобное, например, Zoopla.
Он использует firebase для своей базы данных, в которой есть коллекция «Дома», причем каждый дом представляет собой документ с полем «идентификатор», которое также является именем документа. Я настроил приложение для создания динамических ссылок, позволяющих пользователям обмениваться свойствами.
@objc private func shareButtonTapped() {
var components = URLComponents()
components.scheme = "https"
components.host = "letmeapp.page.link"
components.path = "/homes"
let homeIDQueryItem = URLQueryItem(name: "HomeID", value: viewModel.home.id)
print(viewModel.home.id)
components.queryItems = [homeIDQueryItem]
let home = viewModel.home
guard let linkParameter = components.url else { return }
print("I am sharing (linkParameter.absoluteString)")
guard let shareLink = DynamicLinkComponents.init(link: linkParameter, domainURIPrefix: "https://letmeapp.page.link")
else {
print("Couldn't create FDL components")
return
}
В приложении есть различные контроллеры просмотра, я хочу открыть «HomeInfoViewController», когда пользователь переходит по ссылке «Поделиться», и отобразить свойство, которым был предоставлен общий доступ. У меня еще недостаточно опыта работы со Swift, и, несмотря на все мои усилия, я не могу понять, как это сделать..
В AppDelegate этот код анализирует входящий URL-адрес, чтобы получить идентификатор из URL-адреса:
if components.path == "/homes" {
if let homeIdQueryItem = queryItems.first(where: {$0.name == "homeID"}) {
guard let homeID = homeIdQueryItem.value else { return }
Ниже приведен пример (я думаю), где приложение открывает экземпляр HomeInfoViewController, когда дом выбран из списка домов в HomeListViewController:
private func openHomeInfoViewController(for home: HomeModel) {
let homeInfoViewModel = HomeInfoViewModel(home: home)
let homeInfoViewController = HomeInfoViewController(viewModel: homeInfoViewModel)
navigationController?.pushViewController(homeInfoViewController, animated: true)}
extension HomeListViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let cellModel = viewModel.cellModels[indexPath.section][indexPath.row]
if let cellModel = cellModel as? HomeListResultTableViewCellModel {
openHomeInfoViewController(for: cellModel.home)
}
}
}
Это еще один пример того, как запускается контроллер HomeInfoViewController, когда пользователь выбирает свойство из своего списка «сохраненных свойств».
private func openHomeInfoViewController(for home: HomeModel) {
let homeInfoViewModel = HomeInfoViewModel(home: home)
let homeInfoViewController = HomeInfoViewController(viewModel: homeInfoViewModel)
navigationController?.pushViewController(homeInfoViewController, animated: true)
}
Я думаю, что моя главная проблема в том, что я не понимаю, как программа узнает, какой дом был нажат, надеюсь, это очевидно для кого-то другого 🙂
Я приношу извинения, если это расплывчато, я попытался предоставить некоторый контекст, но при необходимости могу предоставить больше. Заранее благодарю Вас за любой и любой вклад.
Чарли
Комментарии:
1. Из предоставленной вами информации я думаю, что ваша модель дома выбрана из идентификатора дома, элемента запроса, переданного в URL-адресе. С помощью этой модели создается модель представления(HomeInfoViewModel) и создается контроллер(HomeInfoViewController).
Ответ №1:
Я не уверен на 100% в вашем вопросе. Похоже, вы спрашиваете: «Как система узнает, какой дом связан с ячейкой, которую пользователь нажимает в таблице». Вот эта информация.
Когда пользователь нажимает на строку в табличном представлении, система отправляет «путь к индексу» для этого элемента func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
. Путь к индексу описывает раздел и строку, которые были выбраны.
Приведенный выше код требует tableView.deselectRow(at: indexPath, animated: true)
удалить выделение из выбранной ячейки. Затем он запрашивает модель представления для поиска записи ячейки с помощью viewModel.cellModels[indexPath.section][indexPath.row]
. Это экземпляр HomeListResultTableViewCellModel
, и система определяет, какой дом был прослушан, просматривая home
свойство этой структуры.
Вероятно, вам нужно присмотреться к cellModels
объекту поближе, чтобы увидеть, как он обрабатывает использование индексов для поиска дома.
Комментарии:
1. Это в основном то, о чем я спрашиваю, да. я понял, что примерно так и происходило в том случае, но тогда не знал, как сделать то же самое, просто основываясь на уже известном идентификаторе. Сегодня я собираюсь еще раз взглянуть на это со свежей головой и посмотреть, смогу ли я разобраться в этом с помощью совета до сих пор, спасибо!
2. В коде, который вы предоставили, может быть недостаточно информации, чтобы помочь. Похоже, вы хотите узнать, как построить или найти
HomeModel
дом на основе идентификатора дома. Я бы посмотрел прямо под тем местом, гдеhomeIdQueryItem
урожайностьhomeID
, и посмотрел, какая логика следует сразу после этого.