Нужна помощь с Swift: откройте / замените контроллер представления на основе входящего URL-адреса

# #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 , и посмотрел, какая логика следует сразу после этого.