iOS开发——swift精讲&MVC应用实战
MVC应用实战
iOS开发中设计模式是很重要的,其中,使用最多的就是MVC模式,今天就简单介绍一下在Swift中这么使用MVC模式来实现我们想要的功能;
模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程序中。在iOS开发中MVC的机制被使用的淋漓尽致,充分理解iOS的MVC模式,有助于我们程序的组织合理性。
1:模型对象
模型对象封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算。例如,模型对象可能是表示游戏中的角色或地址簿中的联系人。用户在视图层中所进行的
创建或修改数据的操作,通过控制器对象传达出去,最终会创建或更新模型对象。模型对象更改时(例如通过网络连接接收到新数据),它通知控制器对象,控制器
对象更新相应的视图对象。
2:视图对象
视图对象是应用程序中用户可以看见的对象。视图对象知道如何将自己绘制出来,并可能对用户的操作作出响应。视图对象的主要目的,就是显示来自应用程序模型对象的数据,并使该数据可被编辑。尽管如此,在 MVC 应用程序中,视图对象通常与模型对象分离。
在iOS应用程序开发中,所有的控件、窗口等都继承自 UIView,对应MVC中的V。UIView及其子类主要负责UI的实现,而UIView所产生的事件都可以采用委托的方式,交给UIViewController实现。
3:控制器对象
在应用程序的一个或多个视图对象和一个或多个模型对象之间,控制器对象充当媒介。控制器对象因此是同步管道程序,通过它,视图对象了解模型对象的更改,反之亦然。控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期。
控制器对象解释在视图对象中进行的用户操作,并将新的或更改过的数据传达给模型对象。模型对象更改时,一个控制器对象会将新的模型数据传达给视图对象,以便视图对象可以显示它。
对于不同的UIView,有相应的UIViewController,对应MVC中的C。例如在iOS上常用的UITableView,它所对应的Controller就是UITableViewController。
- Model和View永远不能相互通信,只能通过Controller传递。
- Controller可以直接与Model对话(读写调用Model),Model通过Notification和KVO机制与Controller间接通信。
- Controller
可以直接与View对话,通过outlet,直接操作View,outlet直接对应到View中的控件,View通过action向
Controller报告事件的发生(如用户Touch我了)。Controller是View的直接数据源(数据很可能是Controller从
Model中取得并经过加工了)。Controller是View的代理(delegate),以同步View与Controller。
- import UIKit
- class AppsModel: NSObject {
- //定义模型的三个属性
- var imageName:String! //图片名称
- var appName:String! //应用名称
- var appDescription:String! //应用描述
- //自定义初始化方法
- init(imageName image_Name:String , app_Name:String , app_Description:String) {
- self.imageName=image_Name
- self.appName=app_Name
- self.appDescription=app_Description
- }
- // MARK: - NSCoding
- func encodeWithCoder(_encoder: NSCoder)
- {
- _encoder.encodeObject(self.imageName, forKey: "M_imageName")
- _encoder.encodeObject(self.appName, forKey: "M_appName")
- _encoder.encodeObject(self.appDescription, forKey: "M_appDescription")
- }
- init(coder decoder: NSCoder)
- {
- // imageName = decoder.decodeObjectForKey("M_imageName") as String
- // appName = decoder.decodeObjectForKey("M_appName") as String
- // appDescription = decoder.decodeObjectForKey("M_appDescription") as String
- //2015年5月2号修改
- imageName = decoder.decodeObjectForKey("M_imageName") as! String
- appName = decoder.decodeObjectForKey("M_appName") as! String
- appDescription = decoder.decodeObjectForKey("M_appDescription") as! String
- }
- }
- import UIKit
- class MyTableViewCell: UITableViewCell {
- var iconImageView:UIImageView! //图片
- var appNameLabel:UILabel! //标题
- var decLabel:UILabel! //描述
- //赋值方法 - 显示cell内容方法
- func showAppInfoWithModel(model:AppsModel)
- {
- //获取model中得图片
- iconImageView.image = UIImage(named: model.imageName)
- //获取model中app名称
- appNameLabel.text = model.appName
- //获取model中app描述
- decLabel.text = model.appDescription
- }
- override init(style: UITableViewCellStyle, reuseIdentifier: String?)
- {
- super.init(style: style, reuseIdentifier: reuseIdentifier)
- //创建iconImageView
- iconImageView = UIImageView(frame: CGRectMake(, , , ))
- self.addSubview(iconImageView)
- //创建appNameLabel
- appNameLabel = UILabel(frame: CGRectMake(, , , ))
- appNameLabel.font = UIFont.systemFontOfSize()
- self.addSubview(appNameLabel)
- //创建decLabel
- decLabel = UILabel(frame: CGRectMake(, , , ))
- decLabel.font = UIFont.systemFontOfSize()
- decLabel.numberOfLines =
- decLabel.textColor = UIColor.lightGrayColor()
- self.addSubview(decLabel)
- }
- required init(coder aDecoder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- override func awakeFromNib() {
- super.awakeFromNib()
- // Initialization code
- }
- override func setSelected(selected: Bool, animated: Bool) {
- super.setSelected(selected, animated: animated)
- // Configure the view for the selected state
- }
- }
- import UIKit
- class UITableViewControllerCustom: UIViewController, UITableViewDataSource, UITableViewDelegate {
- var titleString:String!
- @IBOutlet var titleLabel:UILabel!
- @IBOutlet var listTableView : UITableView!
- //定义数组
- var items:[AppsModel]!
- //返回按钮事件
- @IBAction func backButtonClick()
- {
- self.navigationController?.popViewControllerAnimated(true)
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- titleLabel.text = titleString
- //定义三个模型对象
- var model1:AppsModel = AppsModel(imageName: "appIcon1.png", app_Name: "Football Maze", app_Description: "足球迷宫,迷宫的新玩法,益智虚拟迷宫游戏。快来挑战你的空间想象,足球迷宫带你到一个不同的世界… 迷宫大家都在玩,你还在等什么。")
- var model2:AppsModel = AppsModel(imageName: "appIcon2.png", app_Name: "租房点评", app_Description: "租房被骗?现在开始,你来改变这一切!《租房点评》为你而备,租房无忧!")
- var model3:AppsModel = AppsModel(imageName: "appIcon3.png", app_Name: "iJump", app_Description: "摇动手机,松鼠就可以运动啦,越跳越高,注意会有虫子咬坏跳板哦,祝你玩得开心")
- var model4:AppsModel = AppsModel(imageName: "appIcon4.png", app_Name: "哪里逃", app_Description: "哪里逃 是一款躲避类游戏,拖动美女图片,躲避,追来的帅锅,帅锅人数越来越多,不要被追到哦。")
- //修改数组值
- items = [model1,model2,model3,model4]
- //TabelView刷新
- listTableView.reloadData()
- // Do any additional setup after loading the view.
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- /*
- // MARK: - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
- // Get the new view controller using segue.destinationViewController.
- // Pass the selected object to the new view controller.
- }
- */
- //MARK: - UITableViewDelegate
- //tableView数据源:返回行数
- func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
- {
- return items.count
- }
- //tableView 数据源:每一行高度
- func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
- {
- }
- //tableView数据源:每一行内容
- func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
- {
- //Cell标示符,代表一系列
- // OC:使用static, swift:使用let
- let cellIdentifier: String = "cellIdentifier"
- //通过cellIdentifier标示符取没有使用的Cell
- //有可能不存在,所以使用:optional
- var cell: MyTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? MyTableViewCell
- //如果cell取到是空
- if cell == nil { // no value
- //创建新的MyTableViewCell实例
- //cell样式:UITableViewCellStyle.Default
- //cell标示符:cellIdentifier
- cell = MyTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIdentifier)
- //设置字体
- // cell!.textLabel.font = UIFont.systemFontOfSize(14)
- //2015年4月10号修改
- cell!.textLabel?.font = UIFont.systemFontOfSize()
- //设置选中cell样式
- cell!.selectionStyle = .Gray;
- //设置cell后面箭头样式
- cell!.accessoryType = .DisclosureIndicator;
- }
- var cellModel:AppsModel = self.items[indexPath.row]
- //通过自定义方法给cell赋值
- cell?.showAppInfoWithModel(cellModel)
- return cell!;
- }
- //tableView代理:点击一行
- func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
- {
- //释放选中效果
- tableView.deselectRowAtIndexPath(indexPath, animated: true)
- var urlString:String! = "https://itunes.apple.com/us/app/fruit-storm/id859713088?l=zh&ls=1&mt=8"
- {
- urlString = "https://itunes.apple.com/us/app/football-maze/id879720177?l=zh&ls=1&mt=8"
- }
- {
- urlString = "https://itunes.apple.com/us/app/zu-fang-dian-ping/id893902071?l=zh&ls=1&mt=8"
- }
- {
- urlString = "https://itunes.apple.com/us/app/ijump/id877475648?l=zh&ls=1&mt=8"
- }
- {
- urlString = "https://itunes.apple.com/us/app/na-li-tao/id880016522?l=zh&ls=1&mt=8"
- }
- UIApplication.sharedApplication().openURL(NSURL(string: urlString)!)
- }
- }
iOS开发——swift精讲&MVC应用实战的更多相关文章
- iOS开发Swift篇—(一)简单介绍
iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...
- iOS开发Swift篇—(二)变量和常量
iOS开发Swift篇—(二)变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 ...
- iOS开发Swift篇—(三)字符串和数据类型
iOS开发Swift篇—(三)字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容 let website = "http://www ...
- iOS开发Swift篇—(四)运算符
iOS开发Swift篇—(四)运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运算符: ...
- iOS开发Swift篇—(五)元组类型
iOS开发Swift篇—(五)元组类型 一.元组类型介绍 1.什么是元组类型 元组类型由 N个 任意类型的数据组成(N >= 0),组成元组类型的数据可以称为“元素” 示例: let posit ...
- iOS开发Swift篇—(六)流程控制
iOS开发Swift篇—(六)流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注意:这 ...
- iOS开发Swift篇—(七)函数(1)
iOS开发Swift篇—(七)函数 一.函数的定义 (1)函数的定义格式 func 函数名(形参列表) -> 返回值类型 { // 函数体... } (2)形参列表的格式 形参名1: 形参类型1 ...
- iOS开发Swift篇—(八)函数(2)
iOS开发Swift篇—(八)函数(2) 一.函数类型 函数类型也是数据类型的一种,它由形参类型和返回值类型组成,格式是 (形参类型列表) -> 返回值类型 func sum(num1: Int ...
- iOS开发Swift篇—(九)属性
iOS开发Swift篇—(九)属性 一.类的定义 Swift与Objective-C定义类的区别 Objective-C:一般需要2个文件,1个.h声明文件和1个.m实现文件 Swift:只需要1个. ...
随机推荐
- PASCALmath库
noi上是让用,noip让用么?貌似不让— — 反正是好东西.在FP中,Math库为我们提供了丰富的数学函数.以下介绍在OI中可能会用到的Math库中一些函数.过程. 使用方法:在程序头用Uses语句 ...
- UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)
题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...
- ASP.NET工作笔记之一:图片上传预览及无刷新上传
转自:http://www.cnblogs.com/sibiyellow/archive/2012/04/27/jqueryformjs.html 最近项目里面涉及到无刷新上传图片的功能,其实也就是上 ...
- 在.net中用Connection对象数据源的架构信息
可得到数据库中的,表,视图,等信息 string strcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + fi ...
- Balanced Numbers(数位+状压)
题意:求给定区间,一个数的数位上每个奇数出现偶数次,每个偶数出现奇数次,这样数的个数 分析:先考虑状态,但总是想不全,所以要把状态压缩一下,用三进制,0 该数不放 1 放了奇数次 2放了偶数次 dp ...
- linux删除数据文件无备份恢复
参考 : http://www.lunar2013.com/2013/06/linux-%E8%AF%AF%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E6%81%A2%E ...
- ios游戏开发--cocos2d学习(3)
------------继续上一节的内容. “接收触摸事件”: CCLayer类是用来接收触摸输入的.不过你要首先启用这个功能才可以使用它. self.isTouchEnabled = YES;//此 ...
- 自问自答之VR遐想
先让我组织一下语言,作为表达能力超弱的战五渣来讲,归纳总结什么的最要命了. 我可以给你分析个1到N条出来,但是一般来讲没什么顺序,想到什么就说什么.而且我属于线性思维,有一个引子就可以按着话头一步步发 ...
- VS2013 :IntelliSense: 不允许使用不完整的类型
出现上述情况,一般是存在对应的头文件,但是没有引用造成的. 引用的时候要注意头文件的顺序, 本项目中的头文件一般先引入,也就是用双引号#include "xxx.h",然后是系统中 ...
- poj 1741 Tree(点分治)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15548 Accepted: 5054 Description ...