轻松学习swift--swift项目初体验(一)

项目需求:做一个图片浏览器,点击图片查看大图,大图模式下,左右滚动能查看不同的图片.
项目的主要核心技术:图片的弹出和消失动画

效果图

项目源代码: Photo-Browser

一.对代码进行重构

1.对代码进行抽取划分

1.1 为什么要对代码进行抽取?
swift中,代码全部写在一起,阅读性极差

2.如何对代码进行抽取?

2.1在oc中,可以把功能模块抽取一个个方法

2.2swift中,专门提供 extension ,可以对原有的类进行扩展

3.怎么使用extension 抽取代码?

3.1 把一些方法写在extension(扩展)里面,这样能减少viewDidLoad里面的代码

3.2 extension可以写多个,这样就可以把不同的功能模块 ,写在不同的扩展里面

Paste_Image.png

二.项目基本设置

1.修改bundleID

2.部署版本

3.设置项目图片,启动图片

4.对文件夹目录进行划分

三.首页布局

1.让首页为UICollectionViewController

2.设置数据源

3.自定义布局

3.1 创建一个源文件,继承自UICollectionViewFlowLayout
3.2 重写 prepareLayout
3.3 设置布局的相关属性

4.如何设置StoryBoard中的UICollectionViewController的布局

4.1 在StoryBoard中选中collectionView
4.2 在属性里找到 layout 设置为自定义 custom
4.3 在下面的class里面 把自定义布局的类名写进去即可

Paste_Image.png

四.网络工具类的封装

1.集成CocoaPods, 并导入AFNetworking框架

1.1 打开终端,进入项目路径下 cd 路径
1.2 创建PodFile文件 pod init
1.3 配置PodFile文件 ,写入要导入的框架

Paste_Image.png

1.4 导入框架 pod install —no-repo-update / 或 pod intall
1.41 pod install 会更新本地库(本地已有的框架也会更新) 速度相对较慢
1.42 pod install —no-repo-update 不会更新本地库,速度相对来说快点

2.封装工具类

2.1 将工具类设计成单例对象
防止别人修改
防止多线程访问,创建多个对象

2.2 swift中单例的设置方式
static let shareInstance : NetworkTools = NetworkTools()

2.3 可以让工具类,直接继承自用到框架的一个类
好处:自己就是这个类的子类,拥有这个类的所有方法和属性,用的时候直接自己就能调用

Paste_Image.png

3.封装网络请求方法

 func requestData (type : Int , urlString : String ,
 parameters : [ String : NSObject] , callBack : 
(result : AnyObject? , error : NSErroe?) -> ()   )


func reqeustData(type : RequestType, urlString : String, 
parameters : [String : NSObject], finishedCallback : 
(result : AnyObject?, error : NSError?) -> ()) {   }

4.把方法里面的闭包抽取出来

4.1 为什么要抽取?
方法里面闭包很长,代码很乱,造成阅读性差

4.2 怎么抽取?
定义一个成员属性 为闭包类型 把方法里面的闭包,用属性名 替换

Paste_Image.png

五.项目集成工具类

 把封装好的工具类,直接拖到项目文件中

六.请求网络数据

1.在控制器中调用工具类封装好的网络请求方法

2.解析数据
要对获取到的数据进行类型转换,应为从网络加载的数据类型为AnyObject

  guard let resultDict = result as? [String : NSObject] else {
            return
        }

  guard let dataArray = resultDict["data"] as? [[String : NSObject]] else {
            return
        }

3.字典转模型

3.1 创建模型

3.2 通过kvc手动转模型 , 要重写 override func setValue(value: AnyObject?, forUndefinedKey key: String) {}

3.3 注意: 在闭包中 self. 也不可以省略

七.自定义cell,展示数据

1.创建cell继承自UICollectionViewCell

2.在cell里面定义模型属性

3.监听属性改变(相当于oc的重写set方法)
在属性监听器(willSet, didSet) 这里用didSet方法里面给模型里面的属性赋值

八.加载更多数据

1.什么时候加载更多的数据?
当最后一个cell出现的时候

2.怎么监听最后一个cell是否出现在屏幕上
通过cell(item)的下标值(从0开始)是否等于数组长度 - 1

  // 最后一个cell已经出现
    if indexPath.item == shops.count - 1 {
       indexPath.item 相当于 tableView 的  indexPath.row
        loadHomeData(shops.count)
    }

3.怎么加载更多数据
和加载数据一样,只不过多传一个参数offset

九.弹出图片浏览器

1.创建图片浏览器的控制器对象UIViewController

2.弹出控制器
2.1 监听cell的点击
2.2 创建图片浏览器控制器对象
2.3 设置图片浏览器控制器对象的弹出样式

 photoBrowserVc.modalTransitionStyle = .FlipHorizontal

2.4 把控制器modal出来

十.布局图片浏览器

1.布局UICollectionView

1.1 创建UICollectionView
1.2 把UICollectionView添加到控制器的View上
1.3 设置数据源
1.4 自定义布局

2.布局两个按钮

2.1 创建两个按钮
2.2 设置按钮的frame

2.3 对UIButton进行extension(扩展)
2.31 为什么要进行扩展
创建出来的按钮,要设置图片,字体,和文字,一个个设置太麻烦,想让按钮创建出来就有这些属性
2.32 怎么进行扩展?
对UIButton进行extension(扩展) 扩充一个类型方法,在类方法里面封装好这些属性

 class func createBtn(title : String, bgColor : UIColor, 
fontSize : CGFloat) -> UIButton {

    let btn = UIButton()

    btn.backgroundColor = bgColor
    btn.setTitle(title, forState: .Normal)
    btn.titleLabel?.font = UIFont.systemFontOfSize(fontSize)

    return btn
}

2.4 这样创建还不是很方便,我们可以给UIbutton扩展构造函数,创建的时候直接设置这些属性

2.41 注意:在extension中扩充构造函数,只能扩充便利构造函数

2.42 什么是便利构造函数?
1.必须在init前面加上convenience
2.必须在init方法中 调用self.init()

convenience init(title : String, bgColor : UIColor, fontSize : CGFloat) {
    self.init()

    setTitle(title, forState: .Normal)
    backgroundColor = bgColor
    titleLabel?.font = UIFont.systemFontOfSize(fontSize)
}

3.监听按钮的点击

3.1 xcode7.2 和xcode7.3中监听方法的写法不太一样
Xcode7.2 --> 1> Selector("方法的名称") 2> ""
Xcode7.3 --> #selector(类.方法名称)

3.2 如果点击按钮调用的方法前面加上private 调用会报错
3.21 为什么会报错
找不到方法

3.22 监听事件实质就是发送一条消息

3.23 发送消息的过程是:
1.将消息包装成@SEL 2.通过@SEL去类中的方法列表中找对相应的方法(函数)

3.34 在swift中,如果一个函数前面加上private,那么该函数就不会被添加到消息(映射)列表中

3.35 如果在private前面加上@objc ,就会保留oc的特性, 该方法依然会添加到消息列表中

3.3 解决问题的方法就是 在private前面加上@objc 或者不写private

想了解更多请查看:轻松学习swift--swift项目初体验(二)

项目源代码: Photo-Browser
喜欢就给个星星吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,105评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,523评论 6 13
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,631评论 4 59
  • 一之日觱发,二之日栗烈,三之日于耜,四之日举趾。《七月》是诗三百里我最喜欢的一首,因为这种随时令而生生不息...
    晓春熙阅读 260评论 0 1
  • 才发现玩滑板要滑开了环视,不能只看前方,那样不美,踩着风火轮,看着后边远去的风景,道路,两旁的风景。风景远去也是别...
    纵情嬉戏天地间阅读 152评论 0 0