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

这篇具有很好参考价值的文章主要介绍了iOS中一种超简单的路由实现方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

背景

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

正文

当你建立了项目组件化跟模块化之后,就可以建立基础项目,基础项目只包括最基本的项目内容,比如基础组建与项目壳工程,额外代码根据实际情况添减。下文着重就讲模块化,因为我觉得现在的工程已经具备了所谓的基础功能,下面就是添加相应的枝枝叶叶,而这些枝枝叶叶我跟倾向于动态管理,比如用git分割管理,需要哪个模块就添加单拉哪个模块,这样本地编译起来也就非常快了,但是模块之间的调用等等得预留相应的说明。

下面展示了基本架构图,基础工程(也可以是壳工程,也可以是添加了部分模块的工程,比如添加了登录注册等等,但是这都无所谓)
iOS中一种超简单的路由实现方式,ios,路由,swift
说到这里再添加一点废话,如果你的项目不是很大,也基本很难发展很大,这玩意压根都可以放在一起,没必要搞什么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一个弹窗的页面,示例图如下:
iOS中一种超简单的路由实现方式,ios,路由,swift

那我怎么调用这个模块来着,参考如下:

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

到了这里,关于iOS中一种超简单的路由实现方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS APP启动广告实现方式 与 APP唤端调用

    APP启动广告功能实现要从2个方面思考 一是UI方案,怎样处理广告页与主页之间的切换方式。 二是广告页展示时机,是使用后台实时广告数据还是使用本地缓存广告数据。后台数据方式获取广告最新但是用户要等待后台返回数据后才能展示,增加用户等待时间。使用本地缓存

    2024年02月01日
    浏览(43)
  • 使用IO完成端口实现简单回显服务器

    使用IO完成端口实现简单回显服务器,因为是测试用的,所以代码很粗糙。 提醒 使用的是ReadFile、WriteFile来实现Overlapped IO,正式场合应该用WSARecv、WSASend,原因:来自《Windows网络编程技术》 8.2.5节 在这里插入图片描述 技术点记录下 io以同步方式立马完成时,系统也会将此通知

    2024年02月06日
    浏览(38)
  • 使用socket.io简单实现多客户端可编辑表格

    之前看了B站小野森森老师的可编辑表格的视频深受启发,今天使用React简单实现一下。 当处于编辑状态的时候,自己和其他人可以看到; 编辑内容后,自己及其他人可以同步看到修改后的内容; 后端服务,使用socket.io起一个后端服务,用于监听连接和发送数据; 前端准备:

    2024年02月06日
    浏览(50)
  • python多线程中一种错误的写法

    直接先上错误代码: 这个代码的问题是: multiprocessing.Pool 使用 pickle 来序列化和反序列化函数和参数,以便在多个进程之间传递。在这个错误代码中, process_function 函数被定义在 first_way 函数内部,这可能导致 pickle 出现问题,因为它无法序列化局部函数。 要解决这个问题,

    2024年02月05日
    浏览(46)
  • golang中一种不常见的switch语句写法

    最近翻开源代码的时候看到了一种很有意思的switch用法,分享一下。 注意这里讨论的不是 typed switch ,也就是case语句后面是类型的那种。 直接看代码: 你也可以在这找到它:代码链接 简单解释下这段代码在做什么:调用systemctl命令检查指定的服务的运行状态,具体做法是过

    2024年02月02日
    浏览(43)
  • 利用简单的IO操作实现M3U8文件之间的合并

    先上代码: 关于m3u8文件的说明: - #EXTM3U:文件头,标识这是一个M3U8文件。 - #EXT-X-VERSION:表示M3U8的版本号。 - #EXT-X-TARGETDURATION:表示每个分段的最长时间(以秒为单位)。 - #EXT-X-MEDIA-SEQUENCE:表示播放列表中的第一个分段的编号。 - #EXTINF:表示当前分段的播放时间长度(

    2024年02月04日
    浏览(48)
  • iOS+Appium最简单的环境搭建,快速实现真机自动化测试

    整理不易耗时两星期配置成功,查看一两年前的教程文章走了太多弯路到处都是坑和报错 需配置环境:Homebrew、node、cnpm、Carthage、ios-deploy、libimobiledeviceideviceinstaller,Xcode,appiumWebDriverAgent,appium Inspector 1. Homebrew安装 Homebrew简称brew,是Mac上的软件管理工具(卸载和安装),和

    2023年04月27日
    浏览(50)
  • 自己开发一种编程语言,可以同时开发鸿蒙,Android ios的三个平台的应用

    要开发一种可以在鸿蒙操作系统、Android操作系统和iOS操作系统上运行的编程语言,需要考虑以下几个方面: 语言设计:首先需要设计一种语言,该语言应具备跨平台的特性,能够在不同操作系统上编写应用程序。这需要考虑语法、语义、类型系统等方面的设计。 编译器或解

    2024年02月04日
    浏览(46)
  • 基于Sane成功解决路由器改OpenWrt打印扫描服务器的手机移动端(IOS、Android)扫描功能实现问题

    家里有一台HP打印扫描一体机HP DJ 2300 series PCL-3,不具备打印和扫描功能。之后买了一个TPlink的wr703n路由器,刷了OpenWrt系统,安装p910nd,通过9100端口的方式实现了无线打印(具体看我写的这篇:TP-LINK-TL-WR703N(原装)制作打印服务器过程记录整理)。但在后期的使用过程中,

    2024年02月06日
    浏览(102)
  • 讲解STM32驱动WS281x灯珠的多种实现方式:普通IO、SPI+DMA、以及PWM+DMA驱动方法

    STM32作为一款高性能、功能丰富的单片机,其丰富的外设和强大的性能,使其在嵌入式领域得到了广泛的应用。本篇文章将介绍如何利用STM32驱动WS281x系列的LED灯珠。我们会使用三种不同的驱动方式进行实现:一种是普通IO方式驱动,一种是SPI+DMA方式驱动,最后一种是PWM+DMA方

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包