Swift开发iOS开发iOS学习笔记

Swift学习_读取json文件&重载

2017-08-01  本文已影响26人  CN_HarrySun
Swift

相关知识:
swift支持方法的重载
方法的重载:方法名称相同,但是参数不同。包括:

  1. 参数的类型不同
  2. 参数的个数不同
override func viewDidLoad() {
    super.viewDidLoad()
   
    // 1.获取json文件路径
    guard let jsonPath = Bundle.main.path(forResource: "MainVCSettings.json", ofType: nil) else{
        print("没有获取到对应的文件路径")
        return
    }
    
    // 2.读取json文件中的内容
    guard let jsonData = NSData(contentsOfFile: jsonPath) else{
        print("没有获取到json文件中的数据")
        return
    }
    
    // 3.将Data转成数组
    // 如果在调用系统某一个方法时,该方法最后有一个throws,说明该方法会抛出异常,那么需要对该异常进行处理

    guard let anyObject = try? JSONSerialization.jsonObject(with: jsonData as Data, options: .mutableContainers) else{
        return
    }
    guard let dictArray = anyObject as?[[String : AnyObject]] else{
        return
    }
    
    // 4.遍历字典,获取对应的信息
    for dict in dictArray{
        // 4.1.获取控制器对应的字符串
        guard let vcName = dict["vcName"] as? String else{
            continue
        }
        // 4.2.获取控制器显示的title
        guard let title = dict["title"] as? String else{
            continue
        }
        // 4.3.获取控制器显示的图标名称
        guard let imageName = dict["imageName"] as? String else{
            continue
        }
        // 4.4.添加子控制器
        addChildViewController(childVCName: vcName, title: title, imageName: imageName)
        
    }
    
}

// 方法重载
// private:私有,在当前文件中可以访问,但是其他文件不能访问
private func addChildViewController(childVCName : String, title : String, imageName : String) {
    
////        NSClassFromString("这里的名字应该是SwiftSHWB.HomeViewController") // 根据字符串获取对应的Class:命名空间+.ViewController的名字
    
    // 1.获取命名空间
    guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as?String else{
        print("没有命名空间")
        return
    }
    
    // 2.根据字符串获取对应的Class
    guard let ChildVCClass = NSClassFromString(nameSpace + "." + childVCName) else {
        print("没有获取到字符串对应的Class")
        return
    }
    
    // 3.将对应的AnyObject转成控制器的类型
    guard let childVCType = ChildVCClass as? UIViewController.Type else {
        print("没有获取对应控制器的类型")
        return
    }
    
    // 4.创建对应的控制器对象
    let childVC = childVCType.init()
    
    // 5.设置子控制器的属性
    childVC.title = title
    childVC.tabBarItem.image = UIImage(named: imageName)
    childVC.tabBarItem.selectedImage = UIImage(named: "\(imageName)_highlighted")
    
    // 6.包装导航控制器
    let childNav = UINavigationController(rootViewController: childVC)
    
    // 7.添加控制器
    addChildViewController(childNav)
}

MainVCSettings.json文件
[
 {
    "vcName": "HomeViewController",
    "title": "首页",
    "imageName": "tabbar_home"
 },
 {
     "vcName": "MessageViewController",
     "title": "消息",
     "imageName": "tabbar_message_center"
 },
 {
     "vcName": "DiscoverViewController",
     "title": "广场",
     "imageName": "tabbar_discover"
 },
 {
     "vcName": "ProfileViewController",
     "title": "我",
     "imageName": "tabbar_profile"
 }
 ]

附录

查看完整专栏《Swift学习》

有问题欢迎指正以及相互探讨 —— CoderSun

上一篇下一篇

猜你喜欢

热点阅读