Swift开发:如何根据传入URL跳转/打开对应房产详情ViewController
现有逻辑识别选中房产的原理
现有列表点击跳转的逻辑不需要额外查询数据库,原理如下:
- 房源列表/收藏列表加载时,会提前从Firebase拉取当前页所有房产的完整
HomeModel数据,封装在每个cell对应的HomeListResultTableViewCellModel中 - 用户点击某行cell时,直接通过indexPath定位到对应位置的cellModel,取出内置的
home属性,直接传入详情页初始化,即可完成对应房产的识别与加载
动态链接跳转实现方案
你需要先解决2个核心问题:1)根据解析到的homeID从Firebase拉取对应的HomeModel;2)确保不管应用当前处于哪个页面,都能正常跳转到详情页。具体实现步骤如下:
步骤1:先修复参数大小写不一致的问题
你生成动态链接时传入的参数名是HomeID(首字母大写),但解析逻辑里匹配的是homeID(首字母小写),大小写不匹配会导致解析不到ID,把解析代码的匹配字段改成一致即可:
// 修改前的解析代码是匹配homeID,改为匹配HomeID if let homeIdQueryItem = queryItems.first(where: {$0.name == "HomeID"}) {
步骤2:新增全局工具方法
首先新增获取当前顶层导航控制器的扩展,方便任意场景下调用跳转:
extension UIApplication { /// 获取当前应用顶层的导航控制器 func topNavigationController() -> UINavigationController? { var topController = self.windows.first?.rootViewController while let presentedController = topController?.presentedViewController { topController = presentedController } return topController as? UINavigationController ?? topController?.navigationController } }
然后新增根据homeID查询房产数据的公用方法:
import FirebaseFirestore func fetchHomeByID(homeID: String, completion: @escaping (HomeModel?) -> Void) { let db = Firestore.firestore() db.collection("Homes").document(homeID).getDocument { snapshot, error in guard let snapshot = snapshot, snapshot.exists, error == nil else { completion(nil) return } // 这里按你现有HomeModel的解析方式把snapshot数据转成HomeModel即可 let home = try? snapshot.data(as: HomeModel.self) completion(home) } }
步骤3:完善AppDelegate解析后的跳转逻辑
在你解析拿到homeID的位置补充以下逻辑:
guard let homeID = homeIdQueryItem.value else { return } // 1. 根据ID拉取房产数据 fetchHomeByID(homeID: homeID) { home in guard let home = home else { // 查无此房产时可以弹出toast提示用户 return } DispatchQueue.main.async { // 2. 拿到顶层导航控制器 guard let nav = UIApplication.shared.topNavigationController() else { return } // 3. 复用你现有的详情页跳转逻辑 let homeInfoViewModel = HomeInfoViewModel(home: home) let homeInfoViewController = HomeInfoViewController(viewModel: homeInfoViewModel) nav.pushViewController(homeInfoViewController, animated: true) } }
可选优化
如果用户点击链接时应用还在冷启动过程中,根控制器还未初始化完成,直接跳转可能会失败,可以把解析到的homeID先存在本地,等首页加载完成后再判断是否有未处理的跳转ID,执行对应的跳转逻辑。
内容的提问来源于stack exchange,提问作者MARCA Admin
相关产品推荐
相关产品推荐

