在 Swift 方面需要帮助:根据传入 URL 打开/替换视图控制器

Need assistance with Swift: open / replace view controller based on incoming URL

我们已经为我们开发了一个应用程序,但希望扩展其功能。该应用程序有一些功能,但就此而言,它是一个类似于 Zoopla 的 属性 应用程序。

它的数据库使用 firebase,其中有一个 'Homes' 集合,每个家庭都是一个文档,其中包含一个 'id' 字段,该字段也是文档的名称。我已将应用配置为创建允许用户共享属性的动态 link。

@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
  }

应用程序有各种视图控制器,我想在用户关注分享link时打开'HomeInfoViewController',并显示已分享的属性。我在 Swift 方面还没有足够的经验,尽管我付出了所有努力,但我还是无法理解如何做到这一点..

在 AppDelegate 中,此代码解析传入的 URL 以从 URL 获取 ID:

    if components.path == "/homes" {
    if let homeIdQueryItem = queryItems.first(where: {[=13=].name == "homeID"}) {
        guard let homeID = homeIdQueryItem.value else { return }

下面是一个示例(我认为),当从 HomeListViewController 的房屋列表中选择一个房屋时,应用程序会打开 HomeInfoViewController 的一个实例:

  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)
        }
       }
     }

这是另一个示例,说明当用户从 'saved properties' 列表中选择 属性 时 HomeInfoViewController 被推送。

  private func openHomeInfoViewController(for home: HomeModel) {
    let homeInfoViewModel = HomeInfoViewModel(home: home)
    let homeInfoViewController = HomeInfoViewController(viewModel: homeInfoViewModel)
    navigationController?.pushViewController(homeInfoViewController, animated: true)
  }

我认为我的主要问题是我不明白该程序如何知道哪个主页已被按下,希望它对其他人来说是显而易见的:)

如果这含糊不清,我深表歉意,我已尝试提供一些背景信息,但如有必要,我可以提供更多信息。预先感谢您的所有贡献。

查理

我不是 100% 确定你的问题。您似乎在问“系统如何知道用户在 table 中点击的单元格与哪个家庭相关联”,这是该信息。

当用户点击 table 视图中的一行时,系统会将该项目的“索引路径”发送到 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)。索引路径描述了被点击的部分和行。

您上面的代码调用 tableView.deselectRow(at: indexPath, animated: true) 以从所选单元格中删除突出显示。然后它要求视图模型使用 viewModel.cellModels[indexPath.section][indexPath.row] 查找单元格记录。这是 HomeListResultTableViewCellModel 的一个实例,系统通过查看该结构的 home 属性 来确定哪个家被窃听了。

您可能需要仔细查看 cellModels 对象,了解它如何使用索引查找房屋。