MVC应用实战

iOS开发中设计模式是很重要的,其中,使用最多的就是MVC模式,今天就简单介绍一下在Swift中这么使用MVC模式来实现我们想要的功能;

模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程序中。在iOS开发中MVC的机制被使用的淋漓尽致,充分理解iOSMVC模式,有助于我们程序的组织合理性。

1:模型对象

模型对象封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算。例如,模型对象可能是表示游戏中的角色或地址簿中的联系人。用户在视图层中所进行的
创建或修改数据的操作,通过控制器对象传达出去,最终会创建或更新模型对象。模型对象更改时(例如通过网络连接接收到新数据),它通知控制器对象,控制器
对象更新相应的视图对象。
2:视图对象
视图对象是应用程序中用户可以看见的对象。视图对象知道如何将自己绘制出来,并可能对用户的操作作出响应。视图对象的主要目的,就是显示来自应用程序模型对象的数据,并使该数据可被编辑。尽管如此,在 MVC 应用程序中,视图对象通常与模型对象分离。

在iOS应用程序开发中,所有的控件、窗口等都继承自 UIView,对应MVC中的V。UIView及其子类主要负责UI的实现,而UIView所产生的事件都可以采用委托的方式,交给UIViewController实现。
3:控制器对象
在应用程序的一个或多个视图对象和一个或多个模型对象之间,控制器对象充当媒介。控制器对象因此是同步管道程序,通过它,视图对象了解模型对象的更改,反之亦然。控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期。

控制器对象解释在视图对象中进行的用户操作,并将新的或更改过的数据传达给模型对象。模型对象更改时,一个控制器对象会将新的模型数据传达给视图对象,以便视图对象可以显示它。

对于不同的UIView,有相应的UIViewController,对应MVC中的C。例如在iOS上常用的UITableView,它所对应的Controller就是UITableViewController。

    1. Model和View永远不能相互通信,只能通过Controller传递。
    2. Controller可以直接与Model对话(读写调用Model),Model通过Notification和KVO机制与Controller间接通信。
    3. Controller
      可以直接与View对话,通过outlet,直接操作View,outlet直接对应到View中的控件,View通过action向
      Controller报告事件的发生(如用户Touch我了)。Controller是View的直接数据源(数据很可能是Controller从
      Model中取得并经过加工了)。Controller是View的代理(delegate),以同步View与Controller。
 
首先我们新建一个项目,然后就可以开始来使用MVC来实现功能了。
 
模型:
  1. import UIKit
  2.  
  3. class AppsModel: NSObject {
  4.  
  5. //定义模型的三个属性
  6. var imageName:String! //图片名称
  7. var appName:String! //应用名称
  8. var appDescription:String! //应用描述
  9.  
  10. //自定义初始化方法
  11. init(imageName image_Name:String , app_Name:String , app_Description:String) {
  12. self.imageName=image_Name
  13. self.appName=app_Name
  14. self.appDescription=app_Description
  15. }
  16.  
  17. // MARK: - NSCoding
  18. func encodeWithCoder(_encoder: NSCoder)
  19. {
  20. _encoder.encodeObject(self.imageName, forKey: "M_imageName")
  21. _encoder.encodeObject(self.appName, forKey: "M_appName")
  22. _encoder.encodeObject(self.appDescription, forKey: "M_appDescription")
  23. }
  24.  
  25. init(coder decoder: NSCoder)
  26. {
  27. // imageName = decoder.decodeObjectForKey("M_imageName") as String
  28. // appName = decoder.decodeObjectForKey("M_appName") as String
  29. // appDescription = decoder.decodeObjectForKey("M_appDescription") as String
  30.  
  31. //2015年5月2号修改
  32. imageName = decoder.decodeObjectForKey("M_imageName") as! String
  33. appName = decoder.decodeObjectForKey("M_appName") as! String
  34. appDescription = decoder.decodeObjectForKey("M_appDescription") as! String
  35. }
  36.  
  37. }
视图:
  1. import UIKit
  2.  
  3. class MyTableViewCell: UITableViewCell {
  4.  
  5. var iconImageView:UIImageView! //图片
  6. var appNameLabel:UILabel! //标题
  7. var decLabel:UILabel! //描述
  8.  
  9. //赋值方法 - 显示cell内容方法
  10. func showAppInfoWithModel(model:AppsModel)
  11. {
  12. //获取model中得图片
  13. iconImageView.image = UIImage(named: model.imageName)
  14.  
  15. //获取model中app名称
  16. appNameLabel.text = model.appName
  17.  
  18. //获取model中app描述
  19. decLabel.text = model.appDescription
  20. }
  21.  
  22. override init(style: UITableViewCellStyle, reuseIdentifier: String?)
  23. {
  24. super.init(style: style, reuseIdentifier: reuseIdentifier)
  25.  
  26. //创建iconImageView
  27. iconImageView = UIImageView(frame: CGRectMake(, , , ))
  28. self.addSubview(iconImageView)
  29.  
  30. //创建appNameLabel
  31. appNameLabel = UILabel(frame: CGRectMake(, , , ))
  32. appNameLabel.font = UIFont.systemFontOfSize()
  33. self.addSubview(appNameLabel)
  34.  
  35. //创建decLabel
  36. decLabel = UILabel(frame: CGRectMake(, , , ))
  37. decLabel.font = UIFont.systemFontOfSize()
  38. decLabel.numberOfLines =
  39. decLabel.textColor = UIColor.lightGrayColor()
  40. self.addSubview(decLabel)
  41.  
  42. }
  43.  
  44. required init(coder aDecoder: NSCoder) {
  45. fatalError("init(coder:) has not been implemented")
  46. }
  47.  
  48. override func awakeFromNib() {
  49. super.awakeFromNib()
  50. // Initialization code
  51. }
  52.  
  53. override func setSelected(selected: Bool, animated: Bool) {
  54. super.setSelected(selected, animated: animated)
  55.  
  56. // Configure the view for the selected state
  57. }
  58.  
  59. }
控制器:
  1. import UIKit
  2.  
  3. class UITableViewControllerCustom: UIViewController, UITableViewDataSource, UITableViewDelegate {
  4.  
  5. var titleString:String!
  6.  
  7. @IBOutlet var titleLabel:UILabel!
  8. @IBOutlet var listTableView : UITableView!
  9.  
  10. //定义数组
  11. var items:[AppsModel]!
  12.  
  13. //返回按钮事件
  14. @IBAction func backButtonClick()
  15. {
  16. self.navigationController?.popViewControllerAnimated(true)
  17. }
  18.  
  19. override func viewDidLoad() {
  20. super.viewDidLoad()
  21.  
  22. titleLabel.text = titleString
  23.  
  24. //定义三个模型对象
  25. var model1:AppsModel = AppsModel(imageName: "appIcon1.png", app_Name: "Football Maze", app_Description: "足球迷宫,迷宫的新玩法,益智虚拟迷宫游戏。快来挑战你的空间想象,足球迷宫带你到一个不同的世界… 迷宫大家都在玩,你还在等什么。")
  26. var model2:AppsModel = AppsModel(imageName: "appIcon2.png", app_Name: "租房点评", app_Description: "租房被骗?现在开始,你来改变这一切!《租房点评》为你而备,租房无忧!")
  27. var model3:AppsModel = AppsModel(imageName: "appIcon3.png", app_Name: "iJump", app_Description: "摇动手机,松鼠就可以运动啦,越跳越高,注意会有虫子咬坏跳板哦,祝你玩得开心")
  28. var model4:AppsModel = AppsModel(imageName: "appIcon4.png", app_Name: "哪里逃", app_Description: "哪里逃 是一款躲避类游戏,拖动美女图片,躲避,追来的帅锅,帅锅人数越来越多,不要被追到哦。")
  29.  
  30. //修改数组值
  31. items = [model1,model2,model3,model4]
  32.  
  33. //TabelView刷新
  34. listTableView.reloadData()
  35.  
  36. // Do any additional setup after loading the view.
  37. }
  38.  
  39. override func didReceiveMemoryWarning() {
  40. super.didReceiveMemoryWarning()
  41. // Dispose of any resources that can be recreated.
  42. }
  43.  
  44. /*
  45. // MARK: - Navigation
  46.  
  47. // In a storyboard-based application, you will often want to do a little preparation before navigation
  48. override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
  49. // Get the new view controller using segue.destinationViewController.
  50. // Pass the selected object to the new view controller.
  51. }
  52. */
  53.  
  54. //MARK: - UITableViewDelegate
  55. //tableView数据源:返回行数
  56. func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
  57. {
  58. return items.count
  59. }
  60.  
  61. //tableView 数据源:每一行高度
  62. func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
  63. {
  64.  
  65. }
  66.  
  67. //tableView数据源:每一行内容
  68. func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
  69. {
  70. //Cell标示符,代表一系列
  71. // OC:使用static, swift:使用let
  72. let cellIdentifier: String = "cellIdentifier"
  73.  
  74. //通过cellIdentifier标示符取没有使用的Cell
  75. //有可能不存在,所以使用:optional
  76. var cell: MyTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? MyTableViewCell
  77.  
  78. //如果cell取到是空
  79. if cell == nil { // no value
  80.  
  81. //创建新的MyTableViewCell实例
  82. //cell样式:UITableViewCellStyle.Default
  83. //cell标示符:cellIdentifier
  84. cell = MyTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIdentifier)
  85.  
  86. //设置字体
  87. // cell!.textLabel.font = UIFont.systemFontOfSize(14)
  88. //2015年4月10号修改
  89. cell!.textLabel?.font = UIFont.systemFontOfSize()
  90.  
  91. //设置选中cell样式
  92. cell!.selectionStyle = .Gray;
  93.  
  94. //设置cell后面箭头样式
  95. cell!.accessoryType = .DisclosureIndicator;
  96. }
  97.  
  98. var cellModel:AppsModel = self.items[indexPath.row]
  99.  
  100. //通过自定义方法给cell赋值
  101. cell?.showAppInfoWithModel(cellModel)
  102.  
  103. return cell!;
  104. }
  105.  
  106. //tableView代理:点击一行
  107. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
  108. {
  109. //释放选中效果
  110. tableView.deselectRowAtIndexPath(indexPath, animated: true)
  111.  
  112. var urlString:String! = "https://itunes.apple.com/us/app/fruit-storm/id859713088?l=zh&ls=1&mt=8"
  113.  
  114. {
  115. urlString = "https://itunes.apple.com/us/app/football-maze/id879720177?l=zh&ls=1&mt=8"
  116. }
  117. {
  118. urlString = "https://itunes.apple.com/us/app/zu-fang-dian-ping/id893902071?l=zh&ls=1&mt=8"
  119. }
  120. {
  121. urlString = "https://itunes.apple.com/us/app/ijump/id877475648?l=zh&ls=1&mt=8"
  122. }
  123. {
  124. urlString = "https://itunes.apple.com/us/app/na-li-tao/id880016522?l=zh&ls=1&mt=8"
  125. }
  126.  
  127. UIApplication.sharedApplication().openURL(NSURL(string: urlString)!)
  128. }
  129. }
 
 
 
 
 
 
 
 
 
 
 

iOS开发——swift精讲&MVC应用实战的更多相关文章

  1. iOS开发Swift篇—(一)简单介绍

    iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...

  2. iOS开发Swift篇—(二)变量和常量

    iOS开发Swift篇—(二)变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 ...

  3. iOS开发Swift篇—(三)字符串和数据类型

    iOS开发Swift篇—(三)字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容  let website = "http://www ...

  4. iOS开发Swift篇—(四)运算符

    iOS开发Swift篇—(四)运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运算符: ...

  5. iOS开发Swift篇—(五)元组类型

    iOS开发Swift篇—(五)元组类型 一.元组类型介绍 1.什么是元组类型 元组类型由 N个 任意类型的数据组成(N >= 0),组成元组类型的数据可以称为“元素” 示例: let posit ...

  6. iOS开发Swift篇—(六)流程控制

    iOS开发Swift篇—(六)流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注意:这 ...

  7. iOS开发Swift篇—(七)函数(1)

    iOS开发Swift篇—(七)函数 一.函数的定义 (1)函数的定义格式 func 函数名(形参列表) -> 返回值类型 { // 函数体... } (2)形参列表的格式 形参名1: 形参类型1 ...

  8. iOS开发Swift篇—(八)函数(2)

    iOS开发Swift篇—(八)函数(2) 一.函数类型 函数类型也是数据类型的一种,它由形参类型和返回值类型组成,格式是 (形参类型列表) -> 返回值类型 func sum(num1: Int ...

  9. iOS开发Swift篇—(九)属性

    iOS开发Swift篇—(九)属性 一.类的定义 Swift与Objective-C定义类的区别 Objective-C:一般需要2个文件,1个.h声明文件和1个.m实现文件 Swift:只需要1个. ...

随机推荐

  1. PASCALmath库

    noi上是让用,noip让用么?貌似不让— — 反正是好东西.在FP中,Math库为我们提供了丰富的数学函数.以下介绍在OI中可能会用到的Math库中一些函数.过程. 使用方法:在程序头用Uses语句 ...

  2. UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)

    题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...

  3. ASP.NET工作笔记之一:图片上传预览及无刷新上传

    转自:http://www.cnblogs.com/sibiyellow/archive/2012/04/27/jqueryformjs.html 最近项目里面涉及到无刷新上传图片的功能,其实也就是上 ...

  4. 在.net中用Connection对象数据源的架构信息

    可得到数据库中的,表,视图,等信息   string strcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + fi ...

  5. Balanced Numbers(数位+状压)

    题意:求给定区间,一个数的数位上每个奇数出现偶数次,每个偶数出现奇数次,这样数的个数 分析:先考虑状态,但总是想不全,所以要把状态压缩一下,用三进制,0 该数不放  1 放了奇数次 2放了偶数次 dp ...

  6. 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 ...

  7. ios游戏开发--cocos2d学习(3)

    ------------继续上一节的内容. “接收触摸事件”: CCLayer类是用来接收触摸输入的.不过你要首先启用这个功能才可以使用它. self.isTouchEnabled = YES;//此 ...

  8. 自问自答之VR遐想

    先让我组织一下语言,作为表达能力超弱的战五渣来讲,归纳总结什么的最要命了. 我可以给你分析个1到N条出来,但是一般来讲没什么顺序,想到什么就说什么.而且我属于线性思维,有一个引子就可以按着话头一步步发 ...

  9. VS2013 :IntelliSense: 不允许使用不完整的类型

    出现上述情况,一般是存在对应的头文件,但是没有引用造成的. 引用的时候要注意头文件的顺序, 本项目中的头文件一般先引入,也就是用双引号#include "xxx.h",然后是系统中 ...

  10. poj 1741 Tree(点分治)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15548   Accepted: 5054 Description ...