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

news/2024/7/7 20:58:04

上一篇中我们快速验证了原型的功能可以实现,接下来就是稍微放慢前进的步伐,来收拾一下之前快速开发时写的稍显蹩脚难看的代码了.

为了让大家还有印象,我把最后修改的方法完整显示如下:

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

    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
    }

    containerVC.toggleSideMenu()
  }

如君所见,在方法中用一个if语句看起来并不是神马好主意.为了从根本上解决我们还得回到ContainerVC里去!

打开ContainerViewController.swift注释掉之前和addKsVC相关的所有代码,现在我们需要完成所有菜单项对应VC的处理,所以有必要写一个初始化方法,将所有内容VC的初始化放在其中,当然目前只有addKsVC一个控制器需要初始化,其他所有的仍使用同一个VC:

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

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

        if orgCenterVC != nil{
            contentVCs = [UIViewController]()
            let count = MenuItem.sharedItems.count
            for _ in 0..<count{
                contentVCs.append(orgCenterVC)
            }

            contentVCs[1] = addKsVC
        }
    }

别忘了在ContainerVC中添加一个新的属性:

var contentVCs:[UIViewController]!

然后在ContainerVC的初始化方法最后加上一句:

initContentVCs()

OK!下面我们来实现当用户tap一个菜单项时完成的功能:切换不同的内容VC,创建如下方法:

func switchContentVC(to index:Int){
        guard index >= 0 && index < contentVCs.count else {return}

        let vc = contentVCs[index]
        vc.view.frame = centerViewController.view.frame
        centerViewController.view.isHidden = true

        centerViewController = vc
        vc.view.isHidden = false

        toggleSideMenu()
    }

可以很清楚的看到,我们之前快速开发原型时的代码帮了大忙,这里只是简单包装一下而已 ;)

现在可以回到SideMenuViewController.swift中去将tableView(_ tableView:UITableView, didSelectRowAt indexPath:IndexPath)方法最终修改为如下内容:

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.switchContentVC(to: indexPath.row)
  }

打完收工,下面是实际App运行时的效果:

这里写图片描述

当然我们只是完成了其中一个VC的替换,不过很容易将其扩展到其他VC中去.不过这个不是重点,重点是如何在一个原有代码基础上怎样完成我们自己想要的扩展效果:既漂亮又有效率!!!

与君共享,与君共勉! ;)


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

相关文章

自用U盘工具 挺实在的

此文件所有材料来至网络&#xff0c;本人只是出于爱好组织一下。本人虽已对其进行过杀毒&#xff0c;但不保证其无毒&#xff0c;又不放心的请勿使用&#xff01;&#xff01;&#xff08;本人不对由此造成的任何问题负责&#xff09; 此文件基本以完美者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("[?]", "&…

Swift中enum自定义类型的实现

在Swift中枚举类型非常强大,内置的实现可以大大减少我们手敲的代码量.下面碰巧就有这么一个需求:Person类里面有一个type属性,其值包含2个内容,一个是name,类型为String,另一个是logo,类型也为字符串,不过表现为绘文字emoji. 因为结构或类的静态属性都可以用点访问符来直接访问…