iOS中一种超简单的路由实现方式

news2025/1/18 17:09:20

看了很多的路由实现方式,发现实现的都太复杂,越是复杂的东西越是难以维护,当然复杂的东西好处就是覆盖面比较全。而本文则是使用一种比较简单的方式实现路由的,当然如有建议或者想法可以及时跟我沟通,让我也能有更好的进步。

背景

对于大型项目,由于编译时间非常长,非常影响我们的开发效率,本来就那么多需求,早点做完可以吃着火锅唱着歌,不好吗?非的都耗在编译上,所以就引出了所谓的项目组件化和模块化。组件化就是根据项目的基础模块,比如网络、图片库等等构成,对于构建组建的粒度大小都可以根据实际项目和团队情况自己决定,没有统一的,如果你在面试什么的时候有人提出意见,你大可以怼他,项目这玩意,哪有心想如意,完全标准化的,小组有几个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“这个模块,点击了也没有用,只有项目中加载了这些代码才会真正的实现跳转。

上面就是一个简单的路由实现。当然涉及到组建和模块的内容还是很多的,各位可以自行研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

reeds_sheep运动规划算法Python源码分析

本文用于记录Python版本zhm-real / PathPlanning运动规划库中reeds_sheep算法的源码分析 关于reeds sheep算法的原理介绍前文已经介绍过了&#xff0c;链接如下所示&#xff1a; 《Reeds-Shepp曲线学习笔记及相关思考》 《Reeds-Shepp曲线基础运动公式推导过程》 正文&#xff…

vite初始化vue3项目(配置自动格式化工具与git提交规范工具)

初始化项目 vite构建vue项目还是比较简单的&#xff0c;简单配置选择一下就行了 初始化命令 npm init vuelatest初始化最新版本vue项目 2. 基本选项含义 Add TypeScript 是否添加TSADD JSX是否支持JSXADD Vue Router是否添加Vue Router路由管理工具ADD Pinia 是否添加pinia…

直方图均衡化和自适应直方图均衡化

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 均衡化是数字图像处理中常用的一种技术&#xff0c;用于增强图像的视觉效果和对比度。&#xff0c;今天我们将实现对同一张图像的直方图均衡化和自适应直方图均衡化处理&#xff0c;学习一下两者的的基本原理和实现过程&a…

docker搭建redis主从复制

docker安装redis docker pull redis:latest创建目录结构 用于挂载数据卷配置文件等 运行redis容器 主redis配置 下面这种方式挂载的配置文件不生效。 docker run -d \--name master_redis_6379 \-p 6379:6379 \--restart unless-stopped \-v /mydata/master_redis/data:/da…

集简云本周新增/更新:新增3大功能,集成19款应用,更新5款应用,新增近290个动作

本周更新概要 功能更新 ◉ 新增功能&#xff1a;语聚AI开放API功能 ◉ 新增功能&#xff1a;数据表表格公开分享功能 ◉ 新增功能&#xff1a;浏览器页面操作页面内容读取(增强版本&#xff09; 应用新增 新增应用&#xff1a;赛捷CRM 新增应用&#xff1a;快跑者 新增应…

LeGO-Loam代码解析(一) 项目介绍、论文解读、配置安装

目录 1.项目介绍 2. 论文解读 LeGO-LOAM&#xff1a;轻量级且地面优化的可变地形激光里程计与建图 2.1 摘要 2.2 介绍 2.3 正文部分1 --- System Review 2.4 正文部分2 --- Segmatation&#xff08;地面点角面点分离&#xff09; 2.5 Feature Extraction 正文部分3 ---…

QT Quick之quick与C++混合编程

Qt quick能够生成非常绚丽界面&#xff0c;但有其局限性的&#xff0c;对于一些业务逻辑和复杂算法&#xff0c;比如低阶的网络编程如 QTcpSocket &#xff0c;多线程&#xff0c;又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等&#xff0c;在 QML 中要么不可…

【操作系统考点汇集】操作系统考点汇集

关于操作系统可能考察的知识点 操作系统基本原理 什么是操作系统&#xff1f; 操作系统是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff0c;以提供给用户和它软件方便的接口和环境&#xff0c;是计算机系统中最基…

【C语言学习】参数传递

调用函数 1.如果函数有参数&#xff0c;调用函数时必须传递给它数量、类型正确的的值。 2.可以传递给函数的值是表达式的结果&#xff0c;包括&#xff1a; 字面量 变量 函数的返回值 计算的结果 int a,b,c; a5; b6; cmax(10,12); cmax(a,b); cmax(c,23); cmax(max(23,45),a);…

opencv实战项目-停车位计数

手势识别系列文章目录 手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&a…

前端基础(JavaScript语法)

前言&#xff1a;今天学习JavaScript的基本语法&#xff0c;包括变量、函数、对象、数组。 目录 JavaScript 变量 函数 对象 数组 JavaScript 变量 定义变量 判断语句 判断等于&#xff1a; 判断不等于&#xff1a;! if else语句 if(vavb){ console.log("…

Harmony OS教程学习笔记

基础知识 1.如何修改程序启动的第一个页面&#xff1f; 不想使用创建的默认的页面&#xff0c;这时需要修改启动页面&#xff0c;修改的地方在EntryAbility文件中的onWindowStageCreate方法中。 onWindowStageCreate(windowStage: window.WindowStage) {// Main window is cr…

解决无法访问 Github 问题

GitHub作为程序员访问最频繁的网站&#xff0c;程序员们经常需要访问 Github找开源项目、学习新框架、管理自己的个人开源项目等等。 github加速器 因为GitHub属于国外的网站&#xff0c;直接访问的话&#xff0c;速度非常慢&#xff0c;甚至访问不了&#xff0c; 今天给大家…

centos下使用jemalloc解决Mysql内存泄漏问题

参考&#xff1a; MySQL bug&#xff1a;https://bugs.mysql.com/bug.php?id83047&tdsourcetags_pcqq_aiomsg https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md &#xff08;1&#xff09;ptmalloc 是glibc的内存分配管理 &#xff08;2&#xff09;tcmalloc…

如何批量修改图片名为不同名称

如何批量修改图片名为不同名称&#xff1f;当今社会&#xff0c;因为人们都养成了随手拍照的习惯&#xff0c;所以拥有上千上万张照片的相册已经司空见惯不足为奇。然而&#xff0c;我们在保存这些照片时往往都会碰到一个大难题——电脑中的图片名称千奇百怪&#xff0c;让整个…

打开软件提示mfc100u.dll缺失是什么意思?要怎么处理?

当你打开某个软件或者运行游戏&#xff0c;系统提示mfc100u.dll丢失&#xff0c;此时这个软件或者游戏根本无法运行。其实&#xff0c;mfc100u.dll是动态库文件&#xff0c;它是VS2010编译的软件所产生的&#xff0c;如果电脑运行程序时提示缺少mfc100u.dll文件&#xff0c;程序…

由“美”出发 听艺术家林曦关于美育与智慧的探讨

不久前&#xff0c;林曦老师与我们的老朋友「十点读书」进行了一次线上直播&#xff0c;有关林曦老师十余年的书法教学&#xff0c;和传统美育的心得&#xff0c;以及因此诞生的新书《无用之美》。      这一次的直播&#xff0c;由“美”的主题出发&#xff0c;延伸出美育…

微服务参数透传实现

说明&#xff1a;在微服务架构中&#xff0c;用户身份经网关验证后&#xff0c;我们可以将用户信息&#xff0c;如ID加入到请求头上。后面的微服务中&#xff0c;可以设置一个拦截器&#xff0c;拦截请求&#xff0c;获取请求头上的用户ID&#xff0c;加入到ThreadLocal中。 最…

Spring【学习记录一】

Spring内容解释 早期的Spring仅指代Spring Framework&#xff0c;后来基于Spring Framework孵化出大量的项目&#xff0c;Spring的含义变成了指代Spring家族 Spring Framework是Spring家族所有成员的基础&#xff0c;想要学透Spring&#xff0c;就必须要掌握Spring Framework…

电脑提示concrt140.dll丢失或找不到怎么恢复

现在系统在安装的时候为了简化包体会将一些组件给删除了&#xff0c;这样会造成在运行某些程序的时候&#xff0c;出现组件丢失的提示。例如concrt140.dll丢失&#xff0c;如果不及时处理&#xff0c;会导致系统中不少程序无法正常使用&#xff0c;那么要如何处理这个问题呢&am…