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
随机推荐
- ionic 添加地图定位功能
由于项目需求,需要一个定位功能,通过google或百度,搜到一个cordova-plugin-geolocation的插件,在ios上可以用,但是在android就呵呵了,原因就不说了,大家都知道.所 ...
- 浅析.NET泛型
泛型是.NET Framework 2.0最强大的功能,通过泛型可以定义类型安全的数据结构,而没有必要使用实际的数据类型,这将显著提高性能并得到更高质量的代码.在.NET Framework 2.0之 ...
- [SLAM] Studying Guidance
Books from Zhihu: 幽默一把 看完Gonzalez:嗯,好像很好玩的样子,我也来搞一搞.看完Price:什么鬼,怎么这么多公式,公式看不懂肿么破.看完Szeliski:原来用一千页的书 ...
- EB-SAM9G45裸机程序下载方法
开发板:EB-SAM9G45 这里提供一种裸程序下载的方法. 在官方提供的下载方法中有手动下载和自动下载,它们都离不开SAM-BA软件,而该软件使用比较麻烦,而且操作不当很容易导致电脑蓝屏,还有一个很 ...
- Python单元测试框架之pytest -- 生成测试报告
继续pytest单元测试框架的学习,pytest可以生成多种类型的测试报告.这一节就来学习pytest如何生成测试报告. 创建test_calss.py 测试用例文件,这里以测试该文件为例. #cod ...
- python读取xml文件
关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码.这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件. 什么是 ...
- 超好玩!10款神奇的字符图案 & 词汇云生成工具
在这里,我们推荐10款惊人的字符图案生成工具.词云可以定义为词频的图形表示,而字符图案发生器是一个把数据,如文字和标签在以视觉和吸引人的方式展示的简单的工具.这些生成工具具有不同的功能,其中包括不同的 ...
- js获取html5 audio 音频时长方法
<audio src="我的好兄弟.mp3" controls="controls" id="audio" style=" ...
- ASP.NET 为GridView添加序号列,且支持分页连续累计显示
为GridView添加序号列,且支持分页连续累计显示,废话不多说,直接上代码: <%@ Page Language="C#" AutoEventWireup="tr ...
- SQL语句技巧之去除重复行
去除表中重复行数据,可能大家立马就想到的是用DISINTCT关键字,但DISINTCT只能是去除表中所有列都相同的行,若碰到需要去除表中多个字段重复的行(即:部份相同,部份不相同),那么该如何做呢?我 ...