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

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. 融合模型Aggregation

    从一堆弱分类器融合得到强分类器. 比如假设现在你只能水平或竖直线分割,那么无论如何都分不好,但是假设组合三次分割,就会得到如图所示的一个较好的分割线. 再比如,PLA 融合后有large margin ...

  2. CodeBlocks X64 SVN 编译版

    CodeBlocks X64 SVN 编译版 采用官方最新的SVN源码编译而来,纯64位的,所以32位系统是不能使用的.字体使用的是微软的YaHei UI字体,如果有更好的字节建议,可以留言. 由于直 ...

  3. PHP面向对象单例模式(懒汉式)

    知识点: 一.三私一公: ①.私有静态属性,又来储存生成的唯一对象 ②.私有构造函数 ③.私有克隆函数,防止克隆——clone ④.公共静态方法,用来访问静态属性储存的对象,如果没有对象,则生成此单例 ...

  4. MyBatis 基本演示

    主配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration P ...

  5. POJ 1064 Cable master | 二分+精度

    题目: 给n个长度为l[i](浮点数)的绳子,要分成k份相同长度的 问最多多长 题解: 二分长度,控制循环次数来控制精度,输出也要控制精度<wa了好多次> #include<cstd ...

  6. Tomcat学习笔记(五)

    生命周期事件 Catalina包含有很多组件.当Catalina启动时,这些组件也会启动,同样,当Catalina关闭时,这些组件也随之关闭,通过实现org.apache.catalina.Lifec ...

  7. maven打包源码

    1. 打包 main 目录代码到 jar 归档文件 mvn source:jar 2. 打包 test 目录代码到 jar 归档文件 mvn source:test-jar

  8. Vitamio 视频播放

     资料总结 Vitamio官网:https://www.vitamio.org 源码地址:https://github.com/yixia/VitamioBundle 最佳教程:大名鼎鼎的农民伯伯博客 ...

  9. 洛谷noip 模拟赛 day1 T1

    T7925 剪纸 题目描述 小芳有一张nnn*mmm的长方形纸片.每次小芳将会从这个纸片里面剪去一个最大的正方形纸片,直到全部剪完(剩下一个正方形)为止. 小芳总共能得到多少片正方形纸片? 输入输出格 ...

  10. 【CF1020E】Sergey's problem(构造)

    题意: 思路:这是一道论文题 https://link.springer.com/content/pdf/10.1007/BFb0066192.pdf From http://www.cnblogs. ...