技术好文:Swit项目

简介: 技术好文:Swit项目

p.p1 { margin: 0; font: 24px "Yuanti SC" }


一、项目部署+配置


二、初始化项目


①常规初始化


class MainViewController: UITabBarController {


override func viewDidLoad() {


super.viewDidLoad()


//1.创建TabBar第一种方法


addChildViewController( "HomeViewController", "首页", "tabbar_home")


addChildViewController( "MessageViewController", "消息", "tabbar_message_center")


addChildViewController( "DiscoverViewController", "发现", "tabbar_discover")


addChildViewController( "ProfileViewController", "我", "tabbarprofile")


}


// swift支持方法的重载


// 方法的重载:方法名称相同,但是参数不同. --> 1.参数的类型不同 2.参数的个数不同


// private在当前文件中可以访问,但是其他文件不能访问


private func addChildViewController( childVcName: String, title : String, imageName : String) {


// 0.获取命名空间(Swift 类名格式: 主工程.类名 - WeiBo.HomeViewController)


guard let nameSpace = Bundle.main.infoDictionary!【"CFBundleExecutable"】 as? String else {


print("没有获取命名空间")


return


}


// 1.根据字符串获取对应的Class


guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVcName) else {


print("没有获取到字符串对应的Class")


return


}


// 2.将对应的AnyObject转成控制器的类型


guard let childVcType = ChildVcClass as? UIViewController.Type else {


print("没有获取对应控制器的类型")


return


}


// 3.创建对应的控制器对象


let childVc = childVcType.init()


// 4.设置子控制器的属性


childVc.title = title


childVc.tabBarItem.image = UIImage.noRenderingImageName(imageName: imageName)


childVc.tabBarItem.selectedImage = UIImage.noRenderingImageName(imageName: imageName + "_highlighted")


// 5.包装导航栏控制器


let childNav = UINavigationController(rootViewController: childVc)


// 6.添加控制器


addChild(childNav)


}


}


②json文件动态初始化


class MainViewController: UITabBarController {


override func viewDidLoad() {


super.viewDidLoad()


//2.通过json文件创建VC,动态初始化TabBarController


// 1.获取json文件路径


guard let jsonPath = Bundle.main.path(forResource: "MainVCSettings.json", //代码效果参考:http://hnjlyzjd.com/xl/wz_25064.html

ofType: nil) else {

print("没有获取到对应的文件路径")


return


}


// 2.读取json文件中的内容


guard let jsonData = NSData(contentsOfFile: jsonPath) else {


print("没有获取到json文件中数据")


return


}


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 //代码效果参考:http://hnjlyzjd.com/hw/wz_25062.html

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(vcName, title, imageName)


}


}


// swift支持方法的重载


// 方法的重载:方法名称相同,但是参数不同. --> 1.参数的类型不同 2.参数的个数不同


// private在当前文件中可以访问,但是其他文件不能访问


private func addChildViewController( childVcName: String, title : String, _ imageName : String) {


// 0.获取命名空间(Swift 类名格式: 主工程.类名 - WeiBo.HomeViewController)


guard let nameSpace = Bundle.main.infoDictionary!【"CFBundleExecutable"】 as? String else {


print("没有获取命名空间")


return


}


// 1.根据字符串获取对应的Class


guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVcName) else {


print("没有获取到字符串对应的Class")


return


}


// 2.将对应的AnyObject转成控制器的类型


guard let childVcType = ChildVcClass as? UIViewController.Type else {


print("没有获取对应控制器的类型")


return


}


// 3.创建对应的控制器对象


let childVc = childVcType.init()


// 4.设置子控制器的属性


childVc.title = title


childVc.tabBarItem.image = UIImage.noRenderingImageName(imageName: imageName)


childVc.tabBarItem.selectedImage = UIImage.noRenderingImageName(imageName: imageName + "_highlighted")


// 5.包装导航栏控制器


let childNav = UINavigationController(rootViewController: childVc)


// 6.添加控制器


addChild(childNav)


}


}


三、异常处理方式


p.p1 { margin: 0; font: 14px "Yuanti SC"; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }


将Data转成数组


如果在调用系统某一个方法时,该方法最后有一个throws.说明该方法会抛出异常.如果一个方法会抛出异常,那么需要对该异常进行处理


p.p1 { margin: 0; font: 14px "Yuanti SC"; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }


在swift中提供三种处理异常的方式


方式一:try方式 程序员手动捕捉异常


do {


try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)


} catch {


// error异常的对象


print(error)


}


p.p1 { margin: 0; font: 14px "Yuanti SC"; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }


方式二:try?方式(常用方式) 系统帮助我们处理异常,如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象


guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {


return


}


p.p1 { margin: 0; font: 14px "Yuanti SC"; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }


方式三:try!方法(不建议,非常危险) 直接告诉系统,该方法没有异常.注意:如果该方法出现了异常,那么程序会报错(崩溃)


let anyObject = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)

相关文章
|
6月前
|
Linux API Apache
技术好文:saltstackpillar
技术好文:saltstackpillar
33 1
|
6月前
|
存储 编解码 索引
技术好文:StudingDay3
技术好文:StudingDay3
|
6月前
|
Python
技术好文:VileGrasshoppers
技术好文:VileGrasshoppers
21 0
|
6月前
|
API C#
技术好文:xluatips
技术好文:xluatips
26 0
|
6月前
|
前端开发
技术好文:wobble
技术好文:wobble
31 0
|
6月前
|
前端开发 关系型数据库 MySQL
技术好文:R基础学习(三)
技术好文:R基础学习(三)
29 0
|
前端开发 数据可视化 测试技术
《设计工程化三部曲-倏昱、闻冰》演讲视频 + 文字版
《设计工程化三部曲-倏昱、闻冰》演讲视频 + 文字版
206 0
|
存储 数据采集 弹性计算
阿里云结合大创项目使用心得体会
本文基于本人的大创项目:基于物联网技术的农田远程监控和管理系统设计与实现,结合阿里云ESC使用的心得,主要应用于硬件端数据采集与软件端应用层的数据交互上,期间涉及数据库在服务器上的使用,良好的实现了大创项目所需要的功能。
阿里云结合大创项目使用心得体会
|
机器学习/深度学习 算法 搜索推荐
一次看完2019技术好文,快收藏!
​2019 即将过去。在今年的最后一天,阿里机器智能献上全年文章汇总。在你遇到技术问题的时候,希望这些内容能够为你提供些许帮助。 2019 感谢有你相伴,2020 我们继续携手前行。
17100 0
一次看完2019技术好文,快收藏!
|
Cloud Native 前端开发 Serverless
深入分析Flutter 技术应用与体系化建设 | 开发者社区精选文章合集(十五)
每一个移动开发者都在为 Flutter 带来的“快速开发、富有表现力和灵活的 UI、原生性能”的特色和理念而痴狂,从超级 App 到独立应用,从纯 Flutter 到混合栈,开发者们在不同的场景下乐此不疲的探索和应用着 Flutter 技术,也在面临着各种各样不同的挑战。本篇来看Flutter 技术解析以及体系化建设。
深入分析Flutter 技术应用与体系化建设 | 开发者社区精选文章合集(十五)
下一篇
DataWorks