Swift学习--微博的基础框架搭建

时间:2022-09-17 18:31:52

学习如何使用Swift写项目

一.搭建微博项目的主框架

1.1--搭建功能模块

Swift学习--微博的基础框架搭建

1.2--在 AppDelegate 中的 didFinishLaunchingWithOptions 函数,设置启动控制器

import UIKit
import CoreData @UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
//创建Window
window = UIWindow(frame: UIScreen.mainScreen().bounds)
window?.backgroundColor = UIColor.whiteColor()
//创建跟控制器
window?.rootViewController = MainViewController()
window?.makeKeyWindow()
return true
}
}

1.3--在MainViewController.swift中添加子控制器

 override func viewDidLoad() {
super.viewDidLoad()
//设置当前控制器对应的tabbar的颜色
//注意:在ios7以前如果设置了tintColor志勇文字会变,但图片不会变
tabBar.tintColor = UIColor.orangeColor()
addChildViewController(HomeTableViewController(), title: "首页", imageName: "tabbar_home")
addChildViewController(HomeTableViewController(), title: "消息", imageName: "tabbar_message_center")
addChildViewController(HomeTableViewController(), title: "广场", imageName: "tabbar_discover")
addChildViewController(HomeTableViewController(), title: "我", imageName: "tabbar_profile")
}
/**
初始化子控制器 - parameter childController: 需要初始化的子控制器
- parameter title: 子控制器的标题
- parameter imageName: 子控制器的图片名字
*/
private func addChildViewController(childController: UIViewController, title:String, imageName:String) {
//设置控制器tabar对应的数据
childController.tabBarItem.image = UIImage(named: imageName)
childController.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
childController.title = title //2.给控制器包装一个导航栏控制器
let nav = UINavigationController()
nav.addChildViewController(childController) //3.将导航栏控制器添加到当前控制器上
addChildViewController(nav)
}

二.如何动态的创建控制器,在需求中可能遇到---在节假日中修改标签栏按钮的图标,这时就需要动态的创建控制器

2.1在项目中创建一个Json类MainVCSettings.json

[
{
"vcName": "HomeTableViewController",
"title": "首页",
"imageName": "tabbar_home"
},
{
"vcName": "MessageTableViewController",
"title": "消息",
"imageName": "tabbar_message_center"
},
{
"vcName": "DiscoverTableViewController",
"title": "广场",
"imageName": "tabbar_discover"
},
{
"vcName": "ProfileTableViewController",
"title": "我",
"imageName": "tabbar_profile"
}
]

2.1 具体实现代码

 override func viewDidLoad() {
super.viewDidLoad()
//设置当前控制器对应的tabbar的颜色
//注意:在ios7以前如果设置了tintColor志勇文字会变,但图片不会变
tabBar.tintColor = UIColor.orangeColor() //1.获取json文件的路径
let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil)
//2.通过文件路径创建NSData
if let jsonPath = path{
let jsonData = NSData(contentsOfFile: jsonPath)
do{
//可能发生的异常代码放到这里
//序列话json数据->Array
//Try:发生异常会跳到catch中继续执行
//Try! :发生一次程序直接崩溃
let dictArr = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers)
//遍历数组,动态创建控制器和设置数据
//在Swift中,如果需要遍历一个数组,必须明确数据的类型
for dict in dictArr as! [[String: String]]
{
//报错的原因是因为addChildViewController参数必须有值,但是字典的返回值是可选类型
addChildViewController(dict["vcName"]!, title: dict["title"]!, imageName: dict["imageName"]!)
}
}
catch
{
//发生异常之后会执行的代码
print(error)
//从本地创建控制器
addChildViewController("HomeTableViewController", title: "首页", imageName: "tabbar_home")
addChildViewController("MessageTableViewController", title: "消息", imageName: "tabbar_message_center")
addChildViewController("DiscoverTableViewController", title: "广场", imageName: "tabbar_discover")
addChildViewController("ProfileTableViewController", title: "我", imageName: "tabbar_profile") }
}
} /**
初始化子控制器 - parameter childController: 需要初始化的子控制器
- parameter title: 子控制器的标题
- parameter imageName: 子控制器的图片名字
*/
private func addChildViewController(childControllerName: String, title:String, imageName:String) {
//动态获取命名空间
let ns = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String //1.将字符串转换为类
//默认情况下命名空间就是项目的名称,但是命名空间名称是可以修改的
let cls:AnyClass? = NSClassFromString(ns + "." + childControllerName) //2通过类创建对象
//将AnyClass转换为指定的类型
let vcCls = cls as! UIViewController.Type
//通过class创建对象
let vc = vcCls.init() //设置控制器tabar对应的数据
vc.tabBarItem.image = UIImage(named: imageName)
vc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
vc.title = title //2.给控制器包装一个导航栏控制器
let nav = UINavigationController()
nav.addChildViewController(vc) //3.将导航栏控制器添加到当前控制器上
addChildViewController(nav)
}

三.创建微博中间加号按钮

 override func viewDidLoad() {
super.viewDidLoad()
//设置当前控制器对应的tabbar的颜色
//注意:在ios7以前如果设置了tintColor志勇文字会变,但图片不会变
tabBar.tintColor = UIColor.orangeColor()
//添加子控制器
addChildViewControllers() }
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated) // 此时 tabBarButton 都已经创建
print(tabBar.subviews)
// 初始化加号按钮
setupComposeBtn()
}
//添加子控制器
func addChildViewControllers(){
//1.获取json文件的路径
let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil)
//2.通过文件路径创建NSData
if let jsonPath = path{
let jsonData = NSData(contentsOfFile: jsonPath)
do{
//可能发生的异常代码放到这里
//序列话json数据->Array
//Try:发生异常会跳到catch中继续执行
//Try! :发生一次程序直接崩溃
let dictArr = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers)
//遍历数组,动态创建控制器和设置数据
//在Swift中,如果需要遍历一个数组,必须明确数据的类型
for dict in dictArr as! [[String: String]]
{
//报错的原因是因为addChildViewController参数必须有值,但是字典的返回值是可选类型
addChildViewController(dict["vcName"]!, title: dict["title"]!, imageName: dict["imageName"]!)
}
}
catch
{
//发生异常之后会执行的代码
print(error)
//从本地创建控制器
addChildViewController("HomeTableViewController", title: "首页", imageName: "tabbar_home")
addChildViewController("MessageTableViewController", title: "消息", imageName: "tabbar_message_center")
// 添加占位控制器
addChildViewController("PlusViewController", title: "", imageName: "")
addChildViewController("DiscoverTableViewController", title: "广场", imageName: "tabbar_discover")
addChildViewController("ProfileTableViewController", title: "我", imageName: "tabbar_profile") } }
} private lazy var composeBtn:UIButton = {
// 1.创建按钮
let button = UIButton()
// 2.设置图片
button.setImage(UIImage(named: "tabbar_compose_icon_add"), forState: UIControlState.Normal)
button.setImage(UIImage(named: "tabbar_compose_icon_add_highlighted"), forState: UIControlState.Highlighted)
// 3.设置背景图片
button.setBackgroundImage(UIImage(named: "tabbar_compose_button"), forState: UIControlState.Normal)
button.setBackgroundImage(UIImage(named: "tabbar_compose_button_highlighted"), forState: UIControlState.Highlighted)
// 4.添加监听
button.addTarget(self, action: "composetBtnClick", forControlEvents: UIControlEvents.TouchUpInside)
// 5.添加到tabBar上
// Swift中能不写self就不写self, 在闭包中必须写self
// self.tabBar.addSubview(button)
// 6.返回按钮
return button
}()
// 运行循环监听到事件后,向 VC 发送消息,动态执行 方法,因此不能设置为 private
func composetBtnClick()
{
print(__FUNCTION__)
}
/**
初始化子控制器 - parameter childController: 需要初始化的子控制器
- parameter title: 子控制器的标题
- parameter imageName: 子控制器的图片名字
*/
private func addChildViewController(childControllerName: String, title:String, imageName:String) {
//动态获取命名空间
let ns = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String //1.将字符串转换为类
//默认情况下命名空间就是项目的名称,但是命名空间名称是可以修改的
let cls:AnyClass? = NSClassFromString(ns + "." + childControllerName) //2通过类创建对象
//将AnyClass转换为指定的类型
let vcCls = cls as! UIViewController.Type
//通过class创建对象
let vc = vcCls.init() //设置控制器tabar对应的数据
vc.tabBarItem.image = UIImage(named: imageName)
vc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
vc.title = title //2.给控制器包装一个导航栏控制器
let nav = UINavigationController()
nav.addChildViewController(vc) //3.将导航栏控制器添加到当前控制器上
addChildViewController(nav)
}
/**
设置加号按钮位置
*/
private func setupComposeBtn(){ // 0.添加到tabBar上
tabBar.addSubview(composeBtn) // 1.计算按钮宽度
let width = tabBar.bounds.width / CGFloat(viewControllers!.count)
// 2.创建按钮frame
let rect = CGRect(x: , y: , width: width, height: tabBar.bounds.height)
// 3.设置按钮frame和偏移位
composeBtn.frame = CGRectOffset(rect, width * , )
}

Swift学习--微博的基础框架搭建的更多相关文章

  1. mybatis学习笔记之基础框架(2)

    mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的*项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,*灵活生成满足s ...

  2. LayIM.AspNetCore Middleware 开发日记(三)基础框架搭建

    前言 在上一篇中简单讲了一些基础知识,例如Asp.Net Core Middleware 的使用,DI的简单使用以及嵌入式资源的使用方法等.本篇就是结合基础知识来构建一个基础框架出来. 那么框架有什么 ...

  3. WebX框架学习笔记之二----框架搭建及请求的发起和处理

    框架搭建 执行环境:windows.maven 执行步骤: 1.新建一个目录,例如:D:\workspace.注意在盘符目录下是无法执行成功的. 2.执行如下命令: mvn archetype:gen ...

  4. Maven 学习笔记(一) 基础环境搭建

    在Java的世界里,项目的管理与构建,有两大常用工具,一个是Maven,另一个是Gradle,当然,还有一个正在淡出的Ant.Maven 和 Gradle 都是非常出色的工具,排除个人喜好,用哪个工具 ...

  5. 新手SSH基础框架搭建

    SSH 为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架. 首先我们先了解SSH的框架所需的包和基本概念: 一.下面我们先来了解一下strut ...

  6. ODB学习笔记之基础环境搭建

      一,简介 ODB是应用于C++的一个开源.跨平台.跨数据库的对象关系映射(ORM)系统. 它可以让你持久化C++对象到关系数据库,而不必处理表.列或者SQL,无需手动编写任何映射代码. ODB支持 ...

  7. Ext学习-HelloWorld以及基础环境搭建

    1.目的    在eclipse中搭建EXTJS的基础环境,学习如何按照从官方下载的代码中搭建新的Extjs工程 2.主要包含内容:   1.ExtJS文件下载以及目录说明   2.ExtJS开发环境 ...

  8. swift学习笔记1——基础部分

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  9. backbone前端基础框架搭建

    前端站点名为:site: 前端框架分为:css.js和img,框架的核心在js文件夹下: js中包括collections.models.views.lib和一个app入口js

随机推荐

  1. 原创:整理编辑jQuery全部思维导图【附下载地址】

    主图 全部图已经打包:下载地址 2. 3. 4. 5. 6. 附上一点简单说明 Dom对象和jquer对象之间的转化 如何将一个jquery对象转换为DOM对象? test是一个span元素 var ...

  2. 《Numerical Methods》-chaper4-一元非线性方程的解

    在许多生产时间问题中,我们根据已知条件往往会列出一个一元非线性方程,一个最典型的例子就是银行存款的问题,由于其利息需要基于前一年的本息和,因此列出来的方程x的指数往往是高次的.还有物理问题当中一系列用 ...

  3. SQL批量信息保存(XML格式字符串数据)

    /* *功能:SQL批量信息录入 *此存储过程获取表单信息,插入表中.*/CREATE  PROC [dbo].[sp_SaveToMX1]@XML text   --明细表XML字符串信息ASBEG ...

  4. 【MySQL】关于MySQL错误日志信息的收集

    为方便维护MySQL,写了个脚本用以提供收集错误信息的接口.这些错误信息来自与MySQL错误日志,而 通过grep mysql可以获取error-log的路径. #!/usr/bin/env pyth ...

  5. css3弹性盒模型(Flexbox)

    Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性. Flexbox布局的主体思想是似的元素可以改变大小以适应可用空间,当可用空间变大,Flex元素将伸展大小以填充可用空间,当 ...

  6. openstack 入门1

    介绍 Rackspace & NASA软件开源项目的组合安装配置复杂基础设施资源的系统管理平台 (网络,计算,存储)个人打井 vs 自来水厂 组件&原理 Horizon -- UI模块 ...

  7. ImageLoader的Jar包加载图片

    注意:需要添加权限,若缓存图片第二个必须要加 <uses-permission android:name="android.permission.INTERNET" /&gt ...

  8. &OpenCurlyDoubleQuote;行业客户云原生最佳实践日” 亮相KubeCon上海

    2018年11月13日至15日,由CNCF主办的KubeCon + CloudNativeCon将首次登陆中国上海,这是全球范围内规模最大的Kubernetes和云原生技术盛会. 唯一聚焦客户实践的分 ...

  9. lettcode21&period; Merge Two Sorted Lists

    lettcode21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The ne ...

  10. 【Spring】Spring MVC文件上传--整合bootstrap-fileinput和jQuery-File-Upload

    前言 这里分享两个使用Spring MVC进行文件上传的简单示例, 分别整合bootstrap-fileinput 和 Jquery File Upload , 代码十分简单, 都是入门的示例,因此这 ...