iOS开发 Swift开发数独游戏(三) 选关界面
一、选关界面涉及到的功能点
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开发数独游戏(三) 选关界面的更多相关文章
- iOS开发 Swift开发数独游戏(四) 游戏界面的界面与逻辑
一.游戏界面涉及到的功能点 1)数独格子的建模 (1)绘制数独格子要考虑到标记功能 所以要在每个格子内预先塞入9个标记数字,仅数独格子算下来就有9*9*9=729个格子且存在大量嵌套(这导致我在操作S ...
- Html5 Egret游戏开发 成语大挑战(四)选关界面
通过前面的开始界面基本上了解了eui的使用方法,可以简单快速的制作一个UI界面,本篇使用第二界面选关界面展示更为难一点的代码控制,来展现关卡地图的内容,请确保素材和资源完整,可以在前面的教程中找到下载 ...
- Unity3D_(游戏)卡牌03_选关界面
启动屏界面.主菜单界面.选关界面.游戏界面 卡牌01_启动屏界面 传送门 卡牌02_主菜单界面 传送门 卡牌03_选关界面 传送门 卡牌04_游戏界面 传送门 选关界面效果 (鼠标放在不同关 ...
- 基于第二次数独游戏,添加GUI界面
高级软件工程第三次作业:基于第二次数独游戏,添加GUI界面.GUI界面代码如下: package firstGui; import java.awt.*; import java.awt.event. ...
- iOS开发 Swift开发数独游戏(一)
一.前言 我姥姥是一名退休数学老师,一直很喜欢玩数独游戏.我以前答应过她要给她写一个数独游戏.本来计划是写一个Android应用的,但恰好我学了好长时间iOS开发一直没做什么"大项目&quo ...
- iOS开发 Swift开发数独游戏(二)数独题目的生成
一.Plist文件结构设计 由于要预先生成数独题目的文件,我自然而然想到用plist存取. 我用Xcode建了几个plist文件来熟悉这种文件使用的结构后设计了如下结构: 为区分难度(后来了解到挖空数 ...
- iOS开发 Swift开发数独游戏(五)显示游戏答案
要点是设置好Tag就好,通过代码找到并初始化即可. 1: // 2: // ShowAnswerController.swift 3: // sudoku-v02 4: // 5: // ...
- Html5 Egret游戏开发 成语大挑战(三)开始界面
本篇需要在前面的素材准备完毕,才可以开始,使用egret的eui结合代码编辑,快速完成基本的界面搭建,这里写的可能比较细,目的是减少大家对于其中一些操作疑问,我去掉了很多无用的步骤,以最精简的流程来完 ...
- IOS系列swift语言之课时三
今天需要掌握的内容就是:闭包.类.结构体.属性(计算属性和延迟属性) 同样里面有一些题目,有兴趣的可以做一下. 首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量 ...
随机推荐
- (笔记) RealTimeRender[实时渲染] C2
@author: 白袍小道 @来源:RealTime Render @建议书籍:龙书.RealTimeR第四版.GPUGem和PRO (来源:暗影不解释) 引点 这一章关注的管线中的管道功能,而非实现 ...
- JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用
目录 描述 原因分析 处理办法 参考 描述 最近研究把项目的JDK升级从1.8升级到9.0.1,在eclipse上配置好JDK为9后,发现项目有错,查看发现sun.misc.BASE64Decoder ...
- PHP上传多文件
知识点: 一.$_FILES数组 ①.$_FILES['filename']['name']上传文件原名 ②.$_FILES['filename']['tmp_name']上传成功后的缓存文件名 ③. ...
- windows系统设备管理器显示全部硬件
下面的小命令能让隐藏的未卸载掉的硬件设备彻底现身:开始-运行-CMD C:\> C:\>start devmgmt.msc 之后再在Windows 的设备管理器中,单击菜单“显示”-“显示 ...
- C++11 tuple元组
C++11 tuple 元组 tuple容器(元组), 是表示元组容器, 是不包含任何结构的,快速而低质(粗制滥造, quick and dirty)的, 可以用于函数返回多个返回值; tuple容器 ...
- AtCoder keyence2019 E Connecting Cities
keyence2019_e $N$ 个节点的无向图 $G$,节点 $i,j$ 之间的边权值为 $|i - j| \times D + A_i + A_j$ . 求最小生成树(Minimum Spann ...
- 银河战舰 [启发式合并+dp]
题面 思路 我们首先考虑传统的链上LIS做法:保存每个长度的LIS末端的最小值,二分查找 那么这道题其实就只是搬到树上来做了而已 我们考虑一个节点,假设它的儿子已经处理完毕了 那么我们选择LIS最长的 ...
- Statement [倍增+线段树]
题面 思路 首先,可以确定的是,本题因为每个点只有一条入边,所以整个图肯定是一个基环外向树森林 那么我们首先考虑树上的情况: 我们考虑一个真点,它会对它的子树里面的所有假点产生贡献 一个真点对一个假点 ...
- Python空间数据处理环境搭
Python空间数据处理环境搭 Conda的下载和安装 什么是Conda? 官方定义:Package, dependency and environment management for any la ...
- [poj] 1236 networks of schools
原题 这是一道强连通分量板子题. 显然subtask1 是要输出入度为0的点的个数 而subtask2,我们考虑一下最优一定是把一个出度为零的点连到入度为零的点上,这样我们要输出的就是max(出度为零 ...


