开发中,我们有一些页面为固定数据的列表页。点击跳往不同的页面。
这样的需求,方法有很多,列举三个常用的方式,最推荐第三个!
数据源:定义一个套字典的数组,跳转只用到标题和类名,可视需求添加其他字段
var listDic = [["vcName":"FirstVC",
"vcTitle":"页面一"],
["vcName":"SecondVC",
"vcTitle":"页面二"],
["vcName":"ThirdVC",
"vcTitle":"页面三"]]
方式一:根据点击行数进行判断,跳不同的页面(没啥技术含量)
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
switch indexPath.row {
case 0:
let vc = FirstVC()
self.navigationController?.pushViewController(vc, animated: true)
case 1:
let vc = SecondVC()
self.navigationController?.pushViewController(vc, animated: true)
case 2:
let vc = ThirdVC()
self.navigationController?.pushViewController(vc, animated: true)
default:
return
}
}
方式二:根据内容判断点击的是哪一个数据,再跳往下一个页面(也没啥技术含量)
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let vcName = listDic[indexPath.row]["vcTitle"] else { return print("error") }
if vcName == "页面一" {
let firstVC = FirstVC()
firstVC.title = vcName
self.navigationController?.pushViewController(firstVC, animated: true)
} else if vcName == "页面二" {
let secondVC = SecondVC()
secondVC.title = vcName
self.navigationController?.pushViewController(secondVC, animated: true)
} else if vcName == "页面三" {
let thirdVC = ThirdVC()
thirdVC.title = vcName
self.navigationController?.pushViewController(thirdVC, animated: true)
}
}
方式三:根据类名自动创建类,OC中映射。在swift中不能直接用,因为多了一个命名空间的概念
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// 数据源: listData = ["SnapDemoVC", "AutomaticVC"]
// 1. 获取去命名空间,由于项目肯定有info.plist文件所有可以机型强制解包.
guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else { return print("没有获取到命名空间")}
print("命名空间为:",nameSpace)
// 2. 拼写命名空间.类名(比如)
let vcName = nameSpace + "." + listDic[indexPath.row]["vcName"]!
print("文件名:", vcName)
// 3. 将类名转化成类
guard let classType = NSClassFromString(vcName) else { return print("\"\(vcName)\" is not class") }
// 4. 将类转化成UIViewController
guard let vcType = classType as? UIViewController.Type else { return print("\"\(vcName)\" is not UIViewController") }
// 5. 用vcType实例化对象
let vc = vcType.init()
// 6. 跳转
navigationController?.pushViewController(vc, animated: true)
}
优点很多,最大优势是,想增、删、改页面跳转时,只需要管理数据源,不需要改didSelectRow里面任何代码,非常简洁,也便于维护。
网友评论