在 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
对象,了解它如何使用索引查找房屋。
我们已经为我们开发了一个应用程序,但希望扩展其功能。该应用程序有一些功能,但就此而言,它是一个类似于 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
对象,了解它如何使用索引查找房屋。