第二天--框架的搭建和未登陆界面的实现

前言

第一天我们把项目如何托管到github中,今天主要记录基本框架的搭建,和简单的UI实现。碰到的问题如下

1、swift中如何动态加载控制
2、swift中本地文件的序列化和容错处理
3、swift按钮事件的监听写法
4、swift中cocopods使用SnapKit
5、如何自定义View和xib定义view以及swift中类方法的写法
6、swift中协议的写法
7、swift中如何用闭包来代替协议

最后简单的实现效果如下图

QQ20160820-0@2x.png

1、动态加载控制

首先继承一个UITabBarController的子类

class YJBaseTabBarViewController: UITabBarController

在该控制中添加我们需要添加的子控制器,子控制需要包装一层导航控制器。一般我不直接使用系统的控制器,所以还写了下面两个类

class YJBaseNaviViewController: UINavigationController
class YJBaseTableViewController: UITableViewController

我们的控制器都继承于 YJBaseTableViewController

在YJBaseTabBarViewController中viewDidLoad中添加子控制,定义一个方法,用来添加子控制器

   // MARK: 添加子控器
   private func  addChildViewController(childController: UIViewController ,title:String, imageName:String) {
    
    let main = childController
    
    main.title = title;
    main.tabBarItem.image = UIImage(named: imageName)
    main.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
    
    //创建一个nav
    let navi = YJBaseNaviViewController()
    navi.addChildViewController(main)
    addChildViewController(navi)

}

我们还可以根据服务器返回的类名来动态加载我们的子控制器,于是我又定义了下面的方法

// MARK: 通过字符串动态加载控制

private func addChildViewController(childControllerName: String,title:String, imageName:String) {
    
    
    //在swift中有动态命名空间的概念,默认未工程名字
    let prodouctName = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
    
    //获取类名
    let className:AnyClass? = NSClassFromString(prodouctName + "." + childControllerName)
    
    // 将类名转化为指定的类型
    let vcCls = className as! UIViewController.Type
    
    // 调用初始化方法
    let childVC = vcCls.init()
    
    
    addChildViewController(childVC, title: title, imageName: imageName)

    
}

这里主要碰到的问题swift中如何通过字符串来获取类名,然后再通过类来创建需要的控制器。上面的代码我想已经写的够详细了。

2、本地文件的序列化处理,使用do和catch来处理序列化容错

由于我们没有网络返回的数据,我们就直接模拟动态加载,在本地添加一个json文件,然后我们解析json文件,然后加载我们的控制器
方法如下:

// 解析本地json
    let jsonPath = NSBundle.mainBundle().pathForResource("localSettings.json", ofType: nil)
    
    if let resultPath = jsonPath {
        
        print(resultPath)
        
         //转为data
        let fileData = NSData.init(contentsOfFile: resultPath)
        
        if let realData = fileData  {
            
            //在这里序列化,序列化可能会出现,抛异常
            
            do {
            
                // 这里正常解析
                let jsonArr = try NSJSONSerialization.JSONObjectWithData(realData, options: .MutableContainers)
                
                //遍历数组,这里需要注意因为json返回的是Anyobject对象,需要将其转为数组
                for dict in jsonArr as![[String:String]] {
                
                    addChildViewController(dict["vcName"]!, title: dict["title"]!, imageName: dict["imageName"]!)
                }
                
                print("解析成功")
             
                
            }
            catch {
            
                print(error)
                // 异常处理,如果解析json失败,就自己创建
                //创建首页
                addChildViewController("YJMainViewController", title: "首页", imageName:"tabbar_home")
                
                //消息
                addChildViewController("YJMessageViewController", title: "消息", imageName:"tabbar_message_center")
                
                //发现
                addChildViewController("YJAttentionViewController", title: "发现", imageName:"tabbar_discover")
                
                //我的
                addChildViewController("YJMineViewController", title: "我的", imageName:"tabbar_profile")
            }
            
            
        }
        
    }

3、按钮点击事件的写法。

上图中间的按钮是我们自己添加一个的按钮,添加点击写法真心蛋筒,需要注意的是响应事件方法也不能用private来修饰
以前添加点击事件的可以这样写:

  btn.addTarget(self, action: "composeClick", forControlEvents: .TouchUpInside)

现在上面的写法已经弃用改用下面的写法,但是蛋痛是写的时候根本没有提示。

  btn.addTarget(self, action: #selector(YJBaseTabBarViewController.composeClick), forControlEvents: .TouchUpInside)

4、cocopods的使用

上面我们基本就能搭建好整体的框架,接下就需要实现未登陆界面,这里有UI布局,我们如果用代码的话,为了适配我们需要用autolayout来布局,我使用第三方库SnapKit,为了方便管理使用Cocopods来安装
a、首先需要安装cocopods,如果没有安装的话。

安装命令:sudo gem install cocoa pod

有可能会碰到安装出错,如下

0DA1D724-CEC7-4851-9D96-4C0FC10CDB4A.png

则用下面的安装命令

sudo gem install -n /usr/local/bin cocoa pods

b、cd 到你工程目录

pod init

然后用Xcode打开编辑

open -a Xcode Podfile

写入下面内容

 use_frameworks!
platform :ios, '9.0'
pod 'SnapKit'

关闭在终端中执行

 pod install

等待安装完成


5754B61B-3058-4ED3-897B-C50B25A3F84D.png

就可以通过上图那个打开我们的工程,这样我们就能使用第三方SnapKit

5、6、7、自定义view和xib自定义view类方法、协议、闭包

首页的未登陆界面,用来代码来自定义view,用Snapkit来布局UI。
代码自定义view必须写下面的方法

// 主页的访客视图、

    override init(frame: CGRect) {
    
    super.init(frame: frame)
    
    addSubview(rorationView)
    
    addSubview(hourseView)
    
    addSubview(introduceLabel)
    
    addSubview(attentionButton)
    
}

// 如果是自定义xib view必须实现这个方法,不是的就不需要实现
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

下面是使用SnapKit布局的部分代码如下

  // 在这里写布局相关的代码
    weak var weakSelf = self

    //旋转视图
    rorationView.snp_makeConstraints { (make) in
        
        make.size.equalTo(CGSizeMake(200, 200))
        make.center.equalTo(weakSelf!)
    }

其中有个关注按钮的点击事件需要传递给控制器,OC最容易想到的使用代理。swift中代理协议的写法必须继承:NSObjectProtocol协议,首先是声明协议。

  //申明协议
  protocol YJMainVisitorViewDelegate:NSObjectProtocol {

// 关注按钮点击
    func attentioButtonClick()
}

在该view申明一个代理,主要需要使用weak关键字来修饰

 // 申明代理
   weak var delegate:YJMainVisitorViewDelegate?

在按钮响应事件中实现

//MARK: 按钮点击事件

    func attentionClick()  {
    
    // 感觉这个写法要比OC简单
     delegate?.attentioButtonClick()
    }

这样想要监听关注点击事件只要成为它代理,遵守协议就能监听点击事件了。使用如下
首先,遵守协议

class YJMainViewController: YJBaseTableViewController,YJMainVisitorViewDelegate

然后成为visitorView的代理

   let visitorView = YJMainVisitorView()
        
        visitorView.delegate = self

最后实现代理方法

//MARK:YJMainVisitorViewDelegate
func attentioButtonClick() {
    
    print("我点击关注按钮了")
}

上面的代理协议实现过程,走了六个步骤,实在让人蛋痛,于是想到了闭包和OC 的block有点类似,于是就尝试了下。
写法如下
首先在view中申明一个闭包属性

 // 定义一个闭包
var attentClickBlock:(()->())?

然后在响应事件中

 //MARK: 按钮点击事件
func attentionClick()  {
   
    // 
    attentClickBlock?()
}

最后在控制器中的使用如下

    let visitorView = YJMainVisitorView()
       
        visitorView.attentClickBlock = {
        
            print("我闭过包来的")
        }

我还是习惯用闭包,因为简单啊,我是个怕麻烦的人。

消息的未登陆页面,我们采用xib关联的方式来实现,必须重写下面的方法

  // 自定义xib重写这个方法
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
     
}

其他实现和OC基本一样我就不描述了,另外就是swift中类方法的写法,使用 internal和 class两个关键字来声明

   //MARK: 获取messageVisitorView,声明类方法 internal
internal class func  messageVisitorView() ->(YJMessageVisitorView){

    return NSBundle.mainBundle().loadNibNamed("YJMessageVisitorView", owner: nil, options: nil).first as! YJMessageVisitorView
}

今天的内容到此结束,如果有什么错误的地方,希望指正,毕竟swift我用的不多,不是很熟,谢谢!!!

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • “我还是很喜欢你,像风走了八千里,不问归期。” 第一次看见这句话,是在C小姐的QQ空间里,那天天气也算很好,只是印...
    虔冰阅读 473评论 0 0
  • 女红主题摄影——遇见沉静美好的你 拈一根花针,细细碎碎 轻倚季节的转角 看流年的风轻轻吹过 始终相信,时光可以带走...
    飞行者自然教育阅读 497评论 0 0
  • 导语:目前我国的融资担保业处于改革转型的关键时期,行业机构规模缩减,代偿压力大,信用体系不健全,传统的债保业务走向...
    Time小菇凉阅读 365评论 0 1
  • 哈喽,我叫纯洁的小恶魔。因手机报废借闺蜜手机一用,发个小说请见谅。 by 纯洁的 ...
    邪恶的小天使阅读 123评论 0 0