看了很多的路由实现方式,发现实现的都太复杂,越是复杂的东西越是难以维护,当然复杂的东西好处就是覆盖面比较全。而本文则是使用一种比较简单的方式实现路由的,当然如有建议或者想法可以及时跟我沟通,让我也能有更好的进步。
背景
对于大型项目,由于编译时间非常长,非常影响我们的开发效率,本来就那么多需求,早点做完可以吃着火锅唱着歌,不好吗?非的都耗在编译上,所以就引出了所谓的项目组件化和模块化。组件化就是根据项目的基础模块,比如网络、图片库等等构成,对于构建组建的粒度大小都可以根据实际项目和团队情况自己决定,没有统一的,如果你在面试什么的时候有人提出意见,你大可以怼他,项目这玩意,哪有心想如意,完全标准化的,小组有几个P8,有几个P9.
正文
当你建立了项目组件化跟模块化之后,就可以建立基础项目,基础项目只包括最基本的项目内容,比如基础组建与项目壳工程,额外代码根据实际情况添减。下文着重就讲模块化,因为我觉得现在的工程已经具备了所谓的基础功能,下面就是添加相应的枝枝叶叶,而这些枝枝叶叶我跟倾向于动态管理,比如用git分割管理,需要哪个模块就添加单拉哪个模块,这样本地编译起来也就非常快了,但是模块之间的调用等等得预留相应的说明。
下面展示了基本架构图,基础工程(也可以是壳工程,也可以是添加了部分模块的工程,比如添加了登录注册等等,但是这都无所谓)
说到这里再添加一点废话,如果你的项目不是很大,也基本很难发展很大,这玩意压根都可以放在一起,没必要搞什么router,router的目的就是为了分割分离。
业务模块A由一个部门负责,业务模块B由一个部分负责,每个业务也许非常的庞大,堆在一起,编译等等都很难,所以我们就在开发的时候只拉去业务模块的代码跟基础工程的代码,这样我们就只集中在这一块,编译量立马下降很多。
现在讲讲我所说的router:
首先建议一个基础的父VC,作为项目所有应用router分发的VC的父VC,其作用时负责参数的传递和回调,代码如下,仅供参考:
import UIKit
typealias BaseCallBack = (AnyObject) -> Void
class MainVC: UIViewController {
var parameters: [String: AnyObject]?
var callback: BaseCallBack?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
创建完父VC之后,我们可以创建一个Router的工具,为router提供服务
import UIKit
class RouterTool: NSObject {
/// 获取模块VC
/// - Parameters:
/// - vcName: 控制器名称
/// - identifier:控制器所在模块
public class func setVc(vcName: String, _ identifier: String? = nil) -> MainVC? {
var bundle = Bundle.main
if let iden = identifier {
bundle = Bundle(identifier: iden) ?? Bundle.main
}
// -1.动态获取命名空间
guard let dict = bundle.infoDictionary else {
return nil
}
guard let cFBundleExecutable = dict["CFBundleExecutable"] else {
return nil
}
let ns = cFBundleExecutable as! String
// 0 .将字符串转换为类
// 0.1默认情况下命名空间就是项目的名称, 但是命名空间名称是可以修改的
guard let cls: AnyClass = NSClassFromString(ns + "." + vcName) else {
return nil
}
// 0.2通过类创建对象
// 0.2.1将AnyClass转换为指定的类型
let vcCls = cls as! MainVC.Type
// 0.2.2通过class创建对象
let vc = vcCls.init()
return vc
}
}
这个工具简单说就是根据给定的vc 字符串来生成对应的UIViewController的
所有用到的router分发的必须得继承这个VC
模块示例如下:
class DViewController: MainVC {
weak var stView: UIView?
override func viewDidLoad() {
super.viewDidLoad()
if let para = parameters {
if let modelView = para["modelView"] as? UIView {
stView = modelView
view.addSubview(modelView)
} else {
return
}
if let values = para["value"] as? [String: Int] {
stView!.snp.makeConstraints { make in
if let top = values["top"] {
make.top.equalTo(top)
}
if let bottom = values["bottom"] {
make.bottom.equalTo(bottom)
}
if let left = values["left"] {
make.top.equalTo(left)
}
if let right = values["right"] {
make.top.equalTo(right)
}
if let center = values["center"] {
make.center.equalToSuperview()
}
}
} else {
stView!.snp.makeConstraints { make in
make.left.equalTo(20)
make.right.equalTo(-20)
make.center.equalToSuperview()
}
}
}
self.view.backgroundColor = .clear
}
@objc func tgr() {
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIView.animate(withDuration: 0.3, delay: 0.1) {
self.view.backgroundColor = .black.withAlphaComponent(0.5)
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.view.backgroundColor = .clear
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let touchLocation = touch.location(in: self.view)
// Check if the touch is outside of stView
if !stView!.frame.contains(touchLocation) {
self.dismiss(animated: true)
}
}
}
上面示例模块就是一个modal一个弹窗的页面,示例图如下:
那我怎么调用这个模块来着,参考如下:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.backgroundColor = .green
}
@IBAction func gotoB(_ sender: Any) {
if let bVc = RouterTool.setVc(vcName: "DViewController") {
let modelView = ModelTestView()
modelView.popular()
bVc.parameters = [
"modelView": modelView,
"values": [
"left": 20,
"right": 20,
"center": 0
]
] as? [String : AnyObject]
bVc.modalPresentationStyle = .overFullScreen
self.present(bVc, animated: false)
}
}
}
上面展示调用和传参的过程,如果我们没有“DViewController“这个模块,点击了也没有用,只有项目中加载了这些代码才会真正的实现跳转。文章来源:https://www.toymoban.com/news/detail-657300.html
上面就是一个简单的路由实现。当然涉及到组建和模块的内容还是很多的,各位可以自行研究。文章来源地址https://www.toymoban.com/news/detail-657300.html
到了这里,关于iOS中一种超简单的路由实现方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!