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

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

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

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中去.不过这个不是重点,重点是如何在一个原有代码基础上怎样完成我们自己想要的扩展效果:既漂亮又有效率!!!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值