一、选关界面涉及到的功能点

1)需要UITableView以及相应数据代理、协议的实现

2)读取plist文件并转化成模型

3)在单元格点击后进入数独游戏,涉及到把数据经segue在UIViewController间传递

4)记录某一关卡是否通过需要用到NSUserDefaults的存档记录功能

 

先放一张效果图

 

二、具体步骤

1、在

Storyboard中拖入一个TableViewController,勾选”Is Initial View Controller”,如图

为了方便设计,我还将Size 设为“freeform” 长宽设为1024*768

2、新建一个Swift类ChooseGameTableView,令其继承UITableViewController,并实现UITableViewDataSource协议。在之前的ViewController属性列表中Custom Class输入新建的类。

3、在Swift类ChooseGameTableView中设置UITableView以及相应数据代理、协议的实现 ,代码如下

   1:  //
   2:  //  ChooseGameTableView.swift
   3:  //  sudoku-v02
   4:  //
   5:  //  Created by 张泽阳 on 2/17/15.
   6:  //  Copyright (c) 2015 张泽阳. All rights reserved.
   7:  //
   8:   
   9:  import Foundation
  10:  import UIKit
  11:  class ChooseGameTableView: UITableViewController,UITableViewDataSource {
  12:      // MARK: - 变量
  13:      //swift貌似现在还不支持#pragma mark 这样的写法
  14:      // 写法参考来源:http://www.tuicool.com/articles/JVZjmm
  15:      var passes = [pass]()
  16:      var touchingP:pass = pass(mytitle: "", isPassed: false, prob: "", solves: [""])
  17:      var touchingCellIndex:NSIndexPath?
  18:      // MARK: - View载入时执行方法
  19:      override func viewDidLoad() {
  20:          //读取plist文件
  21:          var path = NSBundle.mainBundle().pathForResource("sudukuR", ofType: "plist")
  22:          var rootDic = NSDictionary(contentsOfFile: path!)
  23:          var PassNum = 0
  24:          var NotFound = "NotFound"//未找到时的标记符
  25:          for i in 1...81 {
  26:              var tempPasses: AnyObject? = rootDic?.objectForKey("D\(i)")//按挖孔数区分难度进行遍历
  27:              if tempPasses == nil {//如果该挖空数下没有关卡则跳过
  28:                  continue
  29:              }
  30:              var CurrentDPasses  = tempPasses as NSArray //转成NSArray
  31:              for SinglePassDic in CurrentDPasses {//遍历得到每一关的单独关卡(Dictionary格式)
  32:                  //数据转模型,添加进passes中
  33:                  passes.append(pass(mytitle: "第\(++PassNum)关 挖空:\(i)", isPassed: getIsPassedByMD5(SinglePassDic.objectForKey("p") as String), prob: SinglePassDic.objectForKey("p") as String, solves: SinglePassDic.objectForKey("s") as [String]))
  34:              }
  35:          }
  36:          self.tableView.dataSource = self
  37:       }
  38:     
  39:      // MARK: - 检查该关卡之前是否已经通过
  40:      func getIsPassedByMD5(pro:String)->Bool{
  41:          var md5 = (pro as NSString).md5()
  42:          //md5加密参考来源:http://minishine.sinaapp.com/?p=86
  43:          //        NSUserDefaults.standardUserDefaults().
  44:          //        println(NSUserDefaults.standardUserDefaults().boolForKey(md5))
  45:          return NSUserDefaults.standardUserDefaults().boolForKey(md5)
  46:      }
  47:     
  48:      // MARK: - tableview一系列设置
  49:      override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
  50:          return 1
  51:      }
  52:      override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  53:          return passes.count
  54:      }
  55:      override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  56:          let cell = tableView.dequeueReusableCellWithIdentifier("pass") as UITableViewCell
  57:          let myPassCell = passes[indexPath.row]
  58:  //        var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
  59:          cell.textLabel?.text = myPassCell.title
  60:          cell.tag = indexPath.row
  61:          if myPassCell.passed {
  62:               cell.accessoryType = UITableViewCellAccessoryType.Checkmark
  63:              cell.backgroundColor = UIColor.greenColor()
  64:          }else{
  65:              cell.accessoryType = UITableViewCellAccessoryType.None
  66:              cell.backgroundColor = UIColor.whiteColor()
  67:          }
  68:         
  69:          
  70:          return cell
  71:      }
  72:      //    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
  73:      //        return "title"
  74:      //    }
  75:      override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
  76:          println("touch")
  77:          //        touchingP = passes[indexPath.row]
  78:          touchingCellIndex = indexPath
  79:          //         println("delivered")
  80:      }
  81:      
  82:      // MARK: - 设置通知监听机制
  83:      override func viewWillAppear(animated: Bool) {
  84:          
  85:          NSNotificationCenter.defaultCenter().addObserver(self, selector:"reloadData2", name: "reload", object: nil)
  86:      }
  87:      func reloadData2(){
  88:          self.tableView.reloadData()
  89:          var tCell:UITableViewCell = self.tableView.cellForRowAtIndexPath(touchingCellIndex!)!
  90:          tCell.accessoryType = UITableViewCellAccessoryType.Checkmark
  91:          tCell.backgroundColor = UIColor.greenColor()
  92:      }
  93:   
  94:      // MARK: - 设置segue跳转时传递的参数
  95:      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!){
  96:  //        println(segue.identifier)
  97:  //        println("sugue")
  98:  //        println((sender as UITableViewCell).tag)
  99:  //        if(segue.identifier == "ShowDetails"){
 100:              var detailViewController:ViewController! = segue.destinationViewController as ViewController
 101:  //            var index = self.tableView.indexPathForSelectedRow()
 102:              detailViewController.prePass = passes[(sender as UITableViewCell).tag]
 103:  //            detailViewController.cellTemp = (sender as UITableViewCell)
 104:  //        }
 105:      }
 106:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

iOS开发 Swift开发数独游戏(三) 选关界面的更多相关文章

  1. iOS开发 Swift开发数独游戏(四) 游戏界面的界面与逻辑

    一.游戏界面涉及到的功能点 1)数独格子的建模 (1)绘制数独格子要考虑到标记功能 所以要在每个格子内预先塞入9个标记数字,仅数独格子算下来就有9*9*9=729个格子且存在大量嵌套(这导致我在操作S ...

  2. Html5 Egret游戏开发 成语大挑战(四)选关界面

    通过前面的开始界面基本上了解了eui的使用方法,可以简单快速的制作一个UI界面,本篇使用第二界面选关界面展示更为难一点的代码控制,来展现关卡地图的内容,请确保素材和资源完整,可以在前面的教程中找到下载 ...

  3. Unity3D_(游戏)卡牌03_选关界面

      启动屏界面.主菜单界面.选关界面.游戏界面 卡牌01_启动屏界面 传送门 卡牌02_主菜单界面 传送门 卡牌03_选关界面 传送门 卡牌04_游戏界面    传送门 选关界面效果 (鼠标放在不同关 ...

  4. 基于第二次数独游戏,添加GUI界面

    高级软件工程第三次作业:基于第二次数独游戏,添加GUI界面.GUI界面代码如下: package firstGui; import java.awt.*; import java.awt.event. ...

  5. iOS开发 Swift开发数独游戏(一)

    一.前言 我姥姥是一名退休数学老师,一直很喜欢玩数独游戏.我以前答应过她要给她写一个数独游戏.本来计划是写一个Android应用的,但恰好我学了好长时间iOS开发一直没做什么"大项目&quo ...

  6. iOS开发 Swift开发数独游戏(二)数独题目的生成

    一.Plist文件结构设计 由于要预先生成数独题目的文件,我自然而然想到用plist存取. 我用Xcode建了几个plist文件来熟悉这种文件使用的结构后设计了如下结构: 为区分难度(后来了解到挖空数 ...

  7. iOS开发 Swift开发数独游戏(五)显示游戏答案

          要点是设置好Tag就好,通过代码找到并初始化即可. 1: // 2: // ShowAnswerController.swift 3: // sudoku-v02 4: // 5: // ...

  8. Html5 Egret游戏开发 成语大挑战(三)开始界面

    本篇需要在前面的素材准备完毕,才可以开始,使用egret的eui结合代码编辑,快速完成基本的界面搭建,这里写的可能比较细,目的是减少大家对于其中一些操作疑问,我去掉了很多无用的步骤,以最精简的流程来完 ...

  9. IOS系列swift语言之课时三

    今天需要掌握的内容就是:闭包.类.结构体.属性(计算属性和延迟属性) 同样里面有一些题目,有兴趣的可以做一下. 首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量 ...

随机推荐

  1. Eclipse下使用SVN插件从服务器获取工程

    1.打开Eclipse 4.4,在Eclipse里打开SVN资源库窗口:点击菜单window-->show view-->other:然后再弹出窗口展开SVN节点,选择SVN资源库   2 ...

  2. Linux网络运维相关

    删除特殊的用户和用户组 userdel games group games   关闭不需要的服务 chkconfig chkconfig --level 345 bluetooth off   删减系 ...

  3. 初识 HTML5(一)

    H5其实就是H4的一个增强版本,我们在利用H5进行网页的构造会更简便,标签语义更简洁明了.首先,我们要理解HTML4,它是HTML的标记+css2+JavaScript的一些基本应用,简言之,就是AP ...

  4. 更优雅的清除浮动float方法

    上篇文章是利用 :after 方法清除浮动float(作用于浮动元素的父元素上). ; } //为了兼容性,因为ie6/7不能使用伪类,所以加上此行代码. .outer:after {;;visibi ...

  5. 设计模式之单例模式与工厂模式的Python实现(一)

    1. 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上 ...

  6. 【bzoj4756】[Usaco2017 Jan]Promotion Counting 离散化+树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832263.html 题目描述 The cows have once again tried to form a s ...

  7. jqury关于cooke的操作写入cookie后只显示一次的DIV提示框代码

    有时候当用户登录系统后,需要给用户弹出提示框,但是不需要总是弹出来,在这里加入访问cookie来判断是否弹出过提示框,如果弹出过那么保存cookie,下次根据cookie是否存在来判断是否弹出 < ...

  8. gdb 记录临时变量

    gdb ./pgm set logging file log set logging on ... set logging off gdb ./pgm | tee -a log ... file a. ...

  9. 自定义topo文件解析

    from mininet.topo import Topo from mininet.net import Mininet from mininet.util import dumpNodeConne ...

  10. 1.tornado基础

    import tornado.web ''' tornado基础web框架模块 ''' import tornado.ioloop ''' tornado的核心循环IO模块,封装了linux的epol ...