iKinds:我是如何一步步重构改造项目从单VC到多VC界面(上)

news/2024/7/7 15:00:35

iKinds是本猫近期准备慢慢把玩的一个项目,项目不是完全从0开始,而是借助于另一个不错的App框架,不过原来的框架使用的都是同一个ViewController模板,现在因为需要扩展为多个不同的VC模板.

原来的框架使用了一些layer的3D动画效果,这对单VC模板工作的很好,现在要改为多VC模板,因为不确定工程量到底有多大所以我觉得有必要先写一些小段代码来测试一些可行性.这就是我们所谓的:原型!

首先在Main.storyboard在添加一个新的UIViewController对象,将其Identity属性窗口中的Storyboard ID设置为:AddKsVC,然后稍微为它打扮一下:

这里写图片描述

注意因为原来的VC外面套了层导航控制器,所以这里我们如法炮制.增加导航控制器的原因是需要在每个VC导航栏添加一些功能按钮.

在Xcode中新建一个AddKsViewController类,继承与UIViewController.马上将刚刚在IB中创建的UIViewController对象的类改为AddKsViewController类.

现在一个测试用的模板VC已经初步建立好了,下面我们就要写些代码来加载它.

在ContainerViewController的init方法中添加如下两行:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
addKsVC = storyboard.instantiateViewController(withIdentifier: "AddKsVC")

由于原来的centerViewController属性用来存放当前右边的VC,我之前已经说过原来框架是单VC模式,所以该属性从来都不会变化,但是现在新的App需要多VC模式,那么centerViewController属性的意义也就变为保存当前显示的VC!

这还不够,我们还需要将addKsVC控制器加载到ContainerVC中,以下代码添加到viewDidLoad中:

addChildViewController(addKsVC)
view.addSubview(addKsVC.view)
addKsVC.view.isHidden = true
addKsVC.didMove(toParentViewController: self)

测试需要我们还得再添加2个属性:

let orgCenterVC:UIViewController!
let addKsVC:UIViewController!

前一个属性用来保存原有的VC,后一个用来引用新添加的VC.

好了,我前面提到因为是快速测试原型,所以难免会写一些”丑陋”的代码,不过好消息是,很快我就会重构它们,让其变得漂漂哒 ;)

打开SideMenuViewController.swift,原来的tableView(_,didSelectRowAt)方法内容如下:

override func tableView(_ tableView:UITableView, didSelectRowAt indexPath:IndexPath) {
    tableView.deselectRow(at: indexPath, animated:true)

    centerViewController.menuItem = MenuItem.sharedItems[(indexPath as NSIndexPath).row]

    let containerVC = parent as! ContainerViewController
    containerVC.toggleSideMenu()
      }

因为整个App界面分为2部分,左边是菜单栏,包含几个菜单项;右边是每个菜单项对应的内容VC,之前所有菜单项对应的都是相同的内容VC,现在为了测试,我先将第2个菜单项对应的VC换掉:

if indexPath.row == 1{
        containerVC.addKsVC.view.frame = containerVC.centerViewController.view.frame
        containerVC.centerViewController.view.isHidden = true
        containerVC.centerViewController = containerVC.addKsVC

        containerVC.addKsVC.view.isHidden = false
    }else{
        containerVC.centerViewController.view.isHidden = true
        containerVC.centerViewController = containerVC.orgCenterVC
        containerVC.orgCenterVC.view.isHidden = false
        }

运行App可以发现当选择第二个菜单项时,右侧的内容VC已经被我们新加的addKsVC很好的代替了 ;) ,而其他的菜单项选择的还是原来的VC.

经过快速开发原型,我们得以验证我们的功能可以实现,虽然目前只有一个新的VC,但是可以很容易的扩展到多个VC上!所以下面我要做的就是:

重构!重构!重构!

(重要的话说3遍)


http://www.niftyadmin.cn/n/581942.html

相关文章

iKinds:我是如何一步步重构改造项目从单VC到多VC界面(下)

上一篇中我们快速验证了原型的功能可以实现,接下来就是稍微放慢前进的步伐,来收拾一下之前快速开发时写的稍显蹩脚难看的代码了. 为了让大家还有印象,我把最后修改的方法完整显示如下: override func tableView(_ tableView:UITableView, didSelectRowAt indexPath:IndexPath…

自用U盘工具 挺实在的

此文件所有材料来至网络,本人只是出于爱好组织一下。本人虽已对其进行过杀毒,但不保证其无毒,又不放心的请勿使用!!(本人不对由此造成的任何问题负责) 此文件基本以完美者u盘维护系统为架构&…

Vue ElementUI el-table 单元格内容过长被隐藏时显示 tooltip

API el-table 设置属性 show-overflow-tooltip 为 true 代码 <template><div><el-table :data"tableData" style"width: 100%" height"250"><el-table-column fixed prop"date" label"日期" >&l…

用replaceAll去掉身份证中的特殊符号

//去掉特殊符号 如500213719851119037X# 去掉# (保留X)cardNo cardNo.replaceAll("[^\\d|X]", "");最后cardNo 500213719851119037X

TableView的accessoryButtonTappedForRow方法执行的时机

敲代码时遇到了这个问题,别偷懒,写下来备查. 当你在IB中对TableView中的accessory(注意,我说的是cell中的accessory,而不是cell)创建segue时,如果你在VC中同时实现以下4个方法,请问调用的次序是神马!? //1 func tableView(_ tableView: UITableView, accessoryButtonTappedF…

c语言面试题__指针篇

1. char * const p;   char const * p   const char *p   上述三个有什么区别&#xff1f;   char * const p; //常量指针&#xff0c;p的值不可以修改   char const * p&#xff1b;//指向常量的指针&#xff0c;指向的常量值不可以改   const char *p&#xff1…

Vue ElementUI el-table 表头不换行且宽度自适应

参考 此篇文章 &#xff0c;在此记录自己的理解和使用。 API el-table 设置属性 render-header 代码 <template><div><el-table :data"tableData" style"width: 100%" height"250"><el-table-column v-for"col of…

replaced替换特殊符号如* ? + \ | *等

对字符串使用replaceAll()方法替换 * ? \ | 等字符的时候会报以下异常 Dangling meta character * near index 0 这主要是因为这些符号在正则表达示中有相应意义。 只需将其改为 [*] 或 \\* 即可。 [colorred]实例&#xff1a;str str.replaceAll("[?]", "&…