
1、采用MVC设计模式
1、什么是MVC模式?
MVC:模型(Model)、视图(View)和控制器(Controller)MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。(控制器Controller)- 负责转发请求,对请求进行处理。(视图View) - 界面设计人员进行图形界面设计。(模型Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
2、本案例采用MVC模式实现
1、搭建框架

2、创建对应的控制器
首先分析:tab Bar上面有4个分页的控制器分别是....首页、阅读、美食、我的...通过观察我们不难发现在这4个视图中有相同的部分。
其次:相同部分包括:状态栏,导航栏,标题、导航栏上的左右Button。在swift中我们可以把相同的放在在一个RootViewController下面,其他的ViewController继承RootViewController
3、开始程序
在开始写之前我们先创建工具<简单来说就是通用属性>
1、屏幕宽度
letscreenWidth =UIScreen.mainScreen().bounds.size.width
2、屏幕高度
letscreenHeight = (UIScreen.mainScreen().bounds.size.height-64)
Tips:这里减掉的64像素 来源: 20 + 44 。20像素 是状态栏的高度,44像素是导航栏高度。
3、给UIColor添加一个扩展方法
extension UIColor{
static func RGBA(red:CGFloat, _green:CGFloat, _blue:CGFloat, _alpha:CGFloat=1) -> UIColor {
return UIColor(red: red /255.0, green: green /255.0, blue: blue /255.0, alpha: alpha)
}
Tips:这里的static必须加上,不然在工程中是无法调用这方法的。这方法就是你传入红、绿、蓝的RGB值得到想要的颜色。alpha 这表示透明度,取值范围0到1。任何颜色的alpha值为1时都是黑色。
4、引入一个概念:工厂设计模式
1、工厂设计模式:使用类方法将一些基础的UI控件的属性总结归纳起来,方便统一修改。
2、类方法:是在实例方法前加上static或者class关键字
3、我们以创建UIButton为例:
static func createButtonWith (frame:CGRect,type:UIButtonType,title:String,titleColor:UIColor,imageName:String,target:AnyObject?,action:Selector,backgroundImageName:String) ->UIButton{
let button =UIButton(type: type)
button.frame= frame
button.setTitle(title, forState:UIControlState.Normal)
button.setTitleColor(titleColor, forState:UIControlState.Normal)
//设置图片
button.setImage(UIImage(named: imageName), forState:UIControlState.Normal)
//设置背景图片
button.setBackgroundImage(UIImage(named: backgroundImageName), forState:UIControlState.Normal)
//添加响应事件
button.addTarget(target, action: action, forControlEvents:UIControlEvents.TouchUpInside)
return button
}
Tips: 这里对Button的8个属性进行封装具体如何是使用后面回讲到。
在这个工厂里面我们需要对UILabel,UIbutton、UIImageView、UItextField进行创建。提醒一下func前面的static不能少。



5、创建RootViewController
前面提到RootViewController应该创建具有相同的东西。



额外提一句:提供一种方式适合全局修改状态栏的颜色,全局的意思就是所有的状态栏。
在Appdelegate.swift文件中设置。代码如下:
UIApplication.sharedApplication().statusBarStyle=UIStatusBarStyle.LightContent
6、RootViewController设置好以后,我们创建MyTableBarController,而MyTableBarController继承UItableBarController。
1、实例化我们前面提到的4个Viewcontreoller
//首页
let homeVC =HomeViewController()
let homeNav =UINavigationController(rootViewController: homeVC)
//阅读
letreadVC =ReadViewController()
letreadNav =UINavigationController(rootViewController: readVC)
//美食
letfoodVC =FoodViewController()
letfoodNav =UINavigationController(rootViewController: foodVC)
//我的
letmyVC =MyViewController()
letmyNav =UINavigationController(rootViewController: myVC)
在uitableBarcontroller中ViewControllers 是是selectedViewController返回的一个数组。
我们把所有实例化的VC放入数组。
是selectedViewController返回
let navArray = [homeNav,readNav,foodNav,myNav]
并执行以下语句:
self.viewControllers= navArray
创建标题:四个标题,我们也放到一个数组中:
let titleArray = ["首页","阅读","美食","我的"]
正如我们第一张图上面显示的在最下面的标题上还有图片的,四张图片。这看起来是4张图片,想一想好像不止,在我们选择这个按钮的时候我们希望他有不同颜色,这样我们就必须一张图片准备两个颜色,一个没有选中颜色,一个选中后的颜色。 其他不多说我只直接上图:

7、设置tabbar
1、遍历数组
for i in 0..navArray.count {
let nav = navArray[i]
//标题
nav.tabBarItem.title= titleArray[i]
//未选中的图片
let unseletedImage =UIImage(named: unselectedImageArray[i])
nav.tabBarItem.image = unseletedImage?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
//选中的图片
let selectedImage = UIImage(named: selectedImageArray[i])
nav.tabBarItem.selectedImage= selectedImage?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
}
2、设置选中时标题的颜色
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.RGBA(255,156,187)], forState:UIControlState.Selected)
8、现在我开始创建第一个HomeViewController,继承RootViewController。
想一想:
在这里我需要什么东西:
第一: tableView 显示我们数据用的。
第二: hub :这是一个第三方库 活动指示器 。说通熟一点就是数据刷新时的小菊花。
第三: cyclePiaying广告轮播 这也是一个第三方库,封装好了的,我们直接调用就好。
第四: 这个页面有多少页算一个属性吧。我们看到是一页,数据加载之后就是不一页咯。
第五: 怎么的也要定义一个数组来存放我们从网络上获取的数据吧。
综上所述HomeViewController 应该具有以上五个属性

要实现界面的搭建,接下来我们要做四件事创建UI、请求数据、返回去刷新数据、设置导航栏。

创建UI


这里我们思考一下:创建UI用了哪些知识点。
第一:对TableView的一个位置确定吧。也就是frame。
第二:设置代理吧。delegate和datasource。由于我们没有继承TableVIewController所以必须让HomeViewController继承UITableViewDelegate,UITableViewDataSource。
第三:我们设置一下分割线的颜色:separator分割的意思
self.tableView.separatorColor=UIColor.RGBA(255,156,187)
这里也调用了我们前面定义的工厂化方法。
取消多余的线条
self.tableView.tableFooterView = UIView()
这里我们用封装好的Carousel来实现广告轮播:
第一:设置大小。frame
self.cyclePlaying=Carousel(frame:CGRectMake(0,0,screenWidth,screenHeight/3))
第二:设置是否需要pageControl
cyclePlaying.needPageControl=true
第三:设置是否需要无限轮播
self.cyclePlaying.infiniteLoop=true
第四:设置pageControl的位置 这一串大写字母落脚点就在最后MIDDLE 中间
self.cyclePlaying.pageControlPositionType=PAGE_CONTROL_POSITION_TYPE_MIDDLE
第五:设置图片数组,使用本地图片
self.cyclePlaying.imageArray= ["shili8","shili2","shili10","shili13","shili24"]
第六:设置为tableVIew的tableHeaderVIew
self.tableView.tableHeaderView=self.cyclePlaying
第七:活动指示器
self.hud=MBProgressHUD(view:self.view)
//设置加载的文字
self.hud.labelText="正在加载..."
//设置中间齿轮的颜色
self.hud.activityIndicatorColor=UIColor.whiteColor()
//设置背景色
self.hud.color=UIColor(white:0, alpha:0.5)
self.view.addSubview(self.hud)
//注册cell,UINib来注册自定义的xib,nibName是自定义的类名
let nib =UINib(nibName:"HomeCell", bundle:nil)
self.tableView.registerNib(nib, forCellReuseIdentifier:"homeCell")
以上为了简便可以写到一起:
self.tableView.registerNib(UINib(nibName:"HomeCell", bundle:nil), forCellReuseIdentifier:"homeCell")
网友评论