Swift学习--微博的基础框架搭建
学习如何使用Swift写项目
一.搭建微博项目的主框架
1.1--搭建功能模块
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学习--微博的基础框架搭建的更多相关文章
- mybatis学习笔记之基础框架(2)
mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足s ...
- LayIM.AspNetCore Middleware 开发日记(三)基础框架搭建
前言 在上一篇中简单讲了一些基础知识,例如Asp.Net Core Middleware 的使用,DI的简单使用以及嵌入式资源的使用方法等.本篇就是结合基础知识来构建一个基础框架出来. 那么框架有什么 ...
- WebX框架学习笔记之二----框架搭建及请求的发起和处理
框架搭建 执行环境:windows.maven 执行步骤: 1.新建一个目录,例如:D:\workspace.注意在盘符目录下是无法执行成功的. 2.执行如下命令: mvn archetype:gen ...
- Maven 学习笔记(一) 基础环境搭建
在Java的世界里,项目的管理与构建,有两大常用工具,一个是Maven,另一个是Gradle,当然,还有一个正在淡出的Ant.Maven 和 Gradle 都是非常出色的工具,排除个人喜好,用哪个工具 ...
- 新手SSH基础框架搭建
SSH 为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架. 首先我们先了解SSH的框架所需的包和基本概念: 一.下面我们先来了解一下strut ...
- ODB学习笔记之基础环境搭建
一,简介 ODB是应用于C++的一个开源.跨平台.跨数据库的对象关系映射(ORM)系统. 它可以让你持久化C++对象到关系数据库,而不必处理表.列或者SQL,无需手动编写任何映射代码. ODB支持 ...
- Ext学习-HelloWorld以及基础环境搭建
1.目的 在eclipse中搭建EXTJS的基础环境,学习如何按照从官方下载的代码中搭建新的Extjs工程 2.主要包含内容: 1.ExtJS文件下载以及目录说明 2.ExtJS开发环境 ...
- swift学习笔记1——基础部分
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- backbone前端基础框架搭建
前端站点名为:site: 前端框架分为:css.js和img,框架的核心在js文件夹下: js中包括collections.models.views.lib和一个app入口js
随机推荐
- android xmlns:tools用法
一开始不明白,后来删掉这个属性之后发现会出现一个提示: pick preview layout from the "Fragment Layout" context menu 原来 ...
- 比较几种工具Python(x,y) Anaconda WinPython
浏览了一些相关的论坛,将几大工具的特点分别总结下: Python(x,y) 更新很慢,稳定性一般,默认带有很多包. WinPython 只能在windows上跑,界面友好,和Python(x,y)是 ...
- Webstrom (或Phpstrom)使用git(oschina-码云)
.登录"码云"(题外话,这名字起得真好),创建一个新项目 .自动进入了新项目主页,复制该git 仓库的https地址,第4步会用到 .打开Webstrom,选择chec ...
- FUNCS.H中的函数声明
/*************************************************************************** ...
- React中的PropTypes详解
propTypes用来规范props必须满足的类型,如果验证不通过将会有warn提示. React PropTypes的种类有: React.PropTypes.array // 队列 React.P ...
- 重构第28 天 重命名bool方法(Rename boolean method)
详解:本文中的”为布尔方法命名”是指如果一个方法带有大量的bool 参数时,可以根据bool 参数的数量,提取出若干个独立的方法来简化参数. 理解: 我们现在要说的重构并不是普通字面意义上的重构,它有 ...
- 【转】MSMQ 微软消息队列 简单 示例
MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程 ...
- POJ 1681---Painter's Problem(高斯消元)
POJ 1681---Painter's Problem(高斯消元) Description There is a square wall which is made of n*n small s ...
- 后缀数组---Milk Patterns
POJ 3261 Description Farmer John has noticed that the quality of milk given by his cows varies from ...
- fibonacci数列的和取余(2)
Maybe ACMers of HIT are always fond of fibonacci numbers, because it is so beautiful. Don't you thin ...