Swift iOS : 字体图标

厌倦了使用位图在xcode的Assets.xcassets内,因为麻烦,包括如下的麻烦:
找图 图需要分尺寸 需要操作员类似工作去管理
然后,现在有了字体图标,就方便多了: 比较成熟的几套库,用名字就可以查
矢量图,尺寸无极缩放,想要多大都行 都在代码和字体文件内,不需要在工程…

Swift iOS :
Archive


Archive 想把对象序列化到文件,可以首先令此对象符合 NSCoding
协议,然后使用归档类完成序列化。 如下案例,可以把对象 User
序列化到文件内: import UIKit @UIApplicationMain class AppDelegate:
UIResponder…

Swift iOS :
创建一个POD


广告 Swift iOS开发小书 ,帮你快速上手开发
http://www.ituring.com.cn/book/2413
正文
你创建了一个迷幻的View,想要向全世界共享它。怎么办?cocoapods可以帮忙。
##创建一个工程,其中有你需要分享的代码 首先,我们创建这样的…

Swift iOS :
定制Cell


TableViewCell提供了种种定制的可能,包括textLabel,detailLabel,各种访问附件等。但是需要死记硬背,何必呢,反正一个继承了UITableViewCell的子类,然后在其内加入自己的定制View其实并不复杂,并且使用了同样的加入subView的方案。因…

Swift iOS :
显示SVG文件的方法


SVG文件是矢量图标准之一,特点是可以缩放,并且可以用可以阅读的源代码的方式(而不是二进制)来存储图形信息。比如如下文件就是一个svg文件:
<svg xmlns=”” viewBox=”0 0 350 100″>
<defs>…

Swift iOS :
在webview的当前网页上提取信息的方法


广告 Swift iOS开发小书 ,帮你快速上手开发
http://epub.ituring.com.cn/946
正文
使用UIWebView装载一个网页后,可能需要提取其内的信息,比较好的方法是使用JavaScript。方法UIWebView.stringByEvaluati…

最小的Swift
App


如何通过通过纯粹的代码,而不依赖于Xcode的StoryBoard,来完成一个App?
首先做些操作性的工作,具体过程是这样的: 打开xcode 创建一个Single View
App
Xcode会进入主要编辑界面。此时,我们打开AppDelegate.swift文件然后覆盖源…

Swift iOS :
CocoaPods


CocoaPods是一个iOS项目的依赖管理器,使用它可以让导入第三方库和处理依赖关系变得简单。
出于测试和验证的目的,这里会创建一个Swift工程,并采用CocoaPods导入第三方HTTP库alamofire。
准备CocoaPods CocoaPods需要系统内已经安装了…

Swift iOS : StackView
详解


StackView
有很多布局可以使用横向布局和纵向布局来组合完成,此种情况下,可以使用
UIStackView 来简化创建布局。 假设我们想要横向布局 3
个标签,标签之间有边距的话,可以这样: import UIKit @UIApplicationMain
class AppDel…

Swift iOS :
解决了一个委托不工作的情况


在解决一个遗产代码的过程中,我希望对UIAlertView稍作封装,以便从巨大的ViewController内分离出特定的AlertView的代码,我这样做的:
import UIKit @UIApplicationMain class AppDelegate: UIRespon…

Swift iOS :
RichText


我们常常看到简单平实的文本显示,然后确实可以通过 RichText
来完成丰富文本的外观,增强界面的表达力。 UILabel 等组件,除了 text
属性外,还有 attributedText 属性,通过构建 NSAttributedString
的实例,并赋值给此属性,就可以设置 RichTex…

Swift iOS :
YYText计算文字占用高度


使用动态文字填充UITableViewCell内容时,需要计算文字占用高度,以便告知UITableViewCell的行高。使用YYText的YYTextLayout可以帮助做到这点。
如下案例,简单封装了YYTextLayout,并通过两个案例调用,演示它的做法:
import…

Swift iOS :
CocoaPods


CocoaPods是iOS最常用最有名的框架依赖管理工具。但是使用过程也是凭空的一波三折的,because
I Love China。 首先你需要ruby环境。 $ruby -v ruby 2.0.0p648 (2015-12-16
revision 53162) [unive…

Swift iOS :
使用Cartography布局


广告 Swift iOS开发小书 ,帮你快速上手开发
http://www.ituring.com.cn/book/2413
正文
使用SnapKit布局当然不错,但是我觉得Cartography更好,因为可以写出更加规整的布局代码。表达式总是比起链式函数容易阅读。
依然是布局三…

Swift iOS
:我的这5个月的学习过程


2015年,我也去看了下objc,第一感觉很不好,C语言和objc的扩展在一起,特别混乱,当时感觉:
都是函数,C的函数和objc的函数创建和使用差别很大,并且混合在一起
objc函数带着参数标签的,函数长的受不了
即使是第一步最小的app,也得了解设计模式,它一开始就出场,叫做…

Swift iOS :
本地化


这篇文章大概是目前你可以看到的最简单的本地化教程。 广告 Swift
iOS开发小书 ,帮你快速上手开发
http://epub.ituring.com.cn/946
目标
本地化的意义,在于iOS切换不同语言时,App可以随同改变,用指定的语言显示应用。iOS提供了一套用来国际…

Swift iOS : attributedText
富文本操作


广告 Swift iOS开发小书 ,帮你快速上手开发
http://www.ituring.com.cn/book/2413
正文
通常给UILabel设置文本,我们都是设置属性UILabel.text。这意味着显示的文本是单一的,整个文本只能有一种同样的文本效果。而另外一个属性…

Swift iOS :
tintColor


在iOS
7后,UIView新增加了一个tintColor属性,这个属性表示的是“色调”,一旦设置颜色给它,那么以此视图为根视图的整个视图层次结构都会被修改颜色。从而可以不必一一赋值就可以在视图体系内得到一致的颜色体系。
如下代码当点击RUN按钮时,整个以self.view为根视…

Swift iOS:AutoLayout
快速介绍


AutoLayout
典型的,加入一个子视图的做法就是创建实例,指定位置,然后把它加入到视图里面来。在指定位置的代码处,一般就是设置
frame 属性即可,就像这样: import UIKit @UIApplicationMain class
AppDelegate: UIResp…

Swift
iOS:SnapKit


iOS默认提供的布局技术强大而愚蠢。幸好有一个封装的包SnapKit,可以让布局变得容易阅读和修改。
假设要在一个UIViewController上布局两个label,要求是:
第一个label的xy距离父视图为5,100 第二个label
的x距离第一个label为10,高度…

Swift iOS :
一个简陋的TableView封装


UITableView功能强大,但是使用delegate设计模式的DataSource真的很不舒服。比如说:
一堆冗长的函数签名 只能拷贝,错一点都无法执行的,也不会提示你不对
冗长的函数签名是这样的: func numberOfSections(in: UITableView…

Swift_iOS:
扫描二维码的方法


可以使用AVFoundation框架来启动相机扫描二维码,把一个二维码转换为一个字符串。
如下应用,进入首页看到一个按钮和一个标签。点按钮的话,会触发一次扫描,把扫描到的二维码转换为字符串后,会显示在标签内。代码如下:
import UIKit @UIApplicationMai…

Swift iOS :
访问自签名证书https服务器


访问HTTPS服务器时,可以使用自签名证书的、在本地的https服务器,对于调试应用是非常方便的。
Apple已经在iOS
9版本要求必须使用https。如果https服务器是CA签署的证书,那么一路绿灯,如果是自签名证书,就需要做两个额外的工作:
在info.plist内加入…

Swift iOS :
内置的下拉刷新


对TableView,下拉刷新新的数据是很方便的。iOS内置有一个下拉刷新控件UIRefreshControl,虽然不能做上拉刷新,但是因为使用简单,倒也值得介绍。
如下代码,使用TableView加载OS列表,每次下拉,都模拟刷新一条新的OS项目:
import UIKit @…

Swift iOS :
闭包的一个应用


我阅读一个开源代码的过程中,常常发现有这样的结构: var textLabel:UILabel
= { let label = UILabel() label.backgroundColor = .red return label
}()功能能够编译,能够运行,因此语法当然是对的…

Swift iOS :
装入webview时,如何让图片都显示在屏幕内


webview装入的网页,常常有幅面比较的图,这些图会超出手机的宽度,因此导致显示不完整。
比如如下案例,加入了两个图片,大小分别为: 650×300 150×150在iPhone
SE的模拟器下,默认情况下,前一张图会在宽度上超出,后一张可以显示完整。
import UIKit…

Swift
iOS:KVO


KVO是Key Value
Observer的缩写,可以用于监视一个对象的属性值变化,然后执行一个代码块(块、函数、闭包等)。Facebook开源了一个KVO框架,KVOController。
这个案例使用KVOController,用于App主题改变通知。通过KVO监视主题的…

Swift iOS :
剿除编译耦合的一种方法


我们常常会需要把多个类耦合在一起以便共同完成一个或者一组功能。但是同时也意味着其中单独的类因为依赖了其他的类,当被转移到其中工程中就会无法无法编译通过,更加谈不上运行了。比如如下的案例的几个类就是完全的胶合在一起:
import UIKit @UIApplicationMain…

Swift iOS :
如果Cell内部有webview怎么自适应呢


Cell高度自适应的问题真多。现在,如果内部有webView,内容动态装入,大小也是各不相同的,并且高度必须根据内容,而不是view本身的高度来适应,怎么办呢?特别是如果有多个webView的情况下。
这样就可以了: import UIKit @UIApplicationMain…

Swift iOS :
上拉刷新或者下拉刷新


框架 MJRefresh 提供了上拉刷新或者下拉刷新,非常的喜闻乐见。 需要使用
pod: target ‘Swift-MJrefresh’ do use_frameworks! # Pods for
Swift-MJrefresh pod ‘MJRefresh’ end 记得去执行命…

Swift iOS : 解析 ISO8601
日期字符串的方法


日期时间常常需要以字符串形式打包到JSON内,常用的字符串格式为ISO8601,格式卡起来是这样的:
“2016-06-05T16:56:57.019+01:00″解析它的关键,是使用DateFormater的时候,写好格式化字符串,内容为:
dateFormatter.date…

Swift iOS : self sized
cell


根据Cell内的内容,动态调整Cell高度,是常用的技术。在iOS 8
或者以上的版本内,这个技术不再需要自己计算行高,而是变得简单无比。
如下案例,假设一个Cell内有两个Label,其中一个单行,第二个多行,根据第二个Label的内容的不同,高度也会不同,这个高度的变大,会导…

Swift iOS :
自动闭包autoclosure


如下为官方文档的定义,但是建议你忽略它,搞懂了自动闭包再来看才容易懂:)
自动闭包是一种自动创建的闭包,用于包装传递给函数作为参数的表达式。这种闭包不接受任何参数,当它被调
用的时候,会返回被包装在其中的表达式的值。这种便利语法让你能够省略闭包的花括号,用一个普通的表达式
来代替…

Swift iOS :
创建一个framework


Swift支持代码按物理模块分割组织,分而治之。其中的一个做法就是在你的工程中使用framework。
本文创建一个最简单framework。 首先创建一个framework工程。步骤为:
创建工程 选择iOS | Framework & Library | Cocoa Tou…

Swift iOS :
模糊化


iOS的模糊化,会让界面很炫酷,用了不能停。本案例使用了FXBlurView,对图片进行模糊处理。
使用Pod文件: target ‘five’ do use_frameworks! pod ‘FXBlurView’, ‘~>
1.6.4’ end然后执行pod install…

Swift iOS : 访问 https
服务器


使用 URLSession 可以访问 https 服务器。为了测试方便,省下自己编写 https
服务器的麻烦,可以使用一个网络服务叫做 httpbin.org/ip, 当访问子 URL
时,它会返回一个 json,格式为: {origin = “221.237.156.243”;} 访问
http…

Swift 访问
sqlite,最快的上手案例


可以使用 sqlite 作为关系数据库来存储 iOS 本地数据。这意味着,通过 sql
语言方便的做数据的增删改查。 sqlite 本身提供了 C 语言的 API,使用 Swift
访问需要 创建一个桥接文件,引入 C API,访问 SQLite 数据库需要使用 SQLite
官方提供的 C 语言风格的 API,所以…

Swift iOS :
plist


plist
plist是一个XML的子集,使用UTF-8编码的文本文件,它的根节点是一个字典,内容由多个主键和值构成。常常用来存储App的配置信息。
可以直接使用NSDictionary类直接存储它的内容到plist内,比如这样: import
UIKit @UIApplica…

Swift iOS : cnodejs api
测试


cnodejs允许使用它提供的api来开发客户端。并且提供了文档。为了测试和验证api,可以使用curl命令来做此事。有了这些命令集合,开发和研究api变得更加容易。如下就是这些可以执行的文档。
发布主题: curl –data “tab=dev&title=title&con…

Swift iOS :
解析json


典型的前台后台的交互操作,几乎都是这样的: 访问后台服务API
然后解析它返回的JSON
使用Alamofire,它的扩展AlamofireObjectMapper可以把HTTP访问获得的结果转换为json对象,使用ObjectMapper可以把json对象和swift对象做一个…

Swift iOS :
编译器的智能


广告 Swift iOS 小书
http://www.ituring.com.cn/book/2413
正文
编辑代码时,不小心弄错了,却意外的发现,这样的代码是可以编译通过和运行的:
@UIApplicationMain class AppDelegate: UIRespon…

Swift iOS :
YYText显示微博@文字的方法


广告 Swift iOS开发小书 ,帮你快速上手开发
http://www.ituring.com.cn/book/2413
正文
第三方库YYText可以完成富文本的输入,如果需要创建类似微博@一样的输入UI,可以使用它的YYTextView组件。具体说:
当内容中有@打头的文…

Swift iOS :
KeyChain


广告 Swift iOS开发小书 ,帮你快速上手开发
http://www.ituring.com.cn/book/2413
正文
KeyChain提供了加密存储敏感信息的方法。所谓的敏感信息,不外是密码,信用卡号等。如果一个对象含有敏感信息,也可以把整个对象序列化为Data,然…

Swift iOS :
WebView缓存图片的方法


广告 Swift iOS开发小书 ,帮你快速上手开发
http://www.ituring.com.cn/book/2413
正文
每次加载WebView内容,如果图片可以缓存的话,速度就会非常快。默认情况下,WebView自己来加载图片,缓存的策略也是自己定的。如想要自己缓存的…

Swift iOS : Core
Data


因为 Cocoa
开发环境已经在新建一个项目时帮助我们进行很多配置,这导致了不少刚接触 iOS
的开发者都存在基础比较薄弱的问题,其中一个最显著的现象就是很多人无法说清一个
app 启动的流程。程序到底是怎么开始的,AppDelegate 到底是什么,xib 或者
storyboard
是怎么被加载到屏幕上的?这一系列的问题虽然在开发中我们不会每次都去关心和自己配置,但是如果能进行一些了解的话对于程序各个部分的职责的明确会很有帮助。

swift 创建的通讯录,实现了联系人的添加 删除 和查看详情.
联系人使用的假数据.
添加使用了闭包传值,传一个 model.
联系人详情和添加还有联系人界面使用了 xib.
除了语法和 OC 不一样,其他步骤和 OC 通讯录没有差别.

Core Data是官方对Sqlite访问的封装框架。使用它的好处是: 不需要自己引入Sqlite动态库和创建桥接文件 不需要使用SQL语言即可访问Sqlite 使用它的首要需求是引入它,像是这样: import CoreData依然假设我们的问题是存储todo项目,字段…

Swift iOS :
#selector


老版本的Swift(小于2.2),想要给Button一个事件的话,需要用到Selector函数,像是这样:
import UIKit @UIApplicationMain class AppDelegate: UIResponder,
UIApplicationDelegate …

Swift iOS :
扩展类的属性


extension可以为类添加新的方法,但是如果想要添加数据成员的话就会被阻止,比如如下代码:
extension Foo { var _title: String? var title: String? { get { return
_title } set { _title …

Swift iOS :
根据内容调整Cell高度的方法


有时候,需要动态调整UITableView的Cell高度,比如内部有一个TextView,内容由用户决定,可长可短的情况下,肯定是希望Cell和TextView可以展示全部内容,因此也需要Cell高度也跟着同步越高了。
如下代码,展示一个长度变化的TextView,当内容变化时…

Swift iOS :
NotificationCenter


类NotificationCenter提供了一种轻耦合的消息传递机制。可以发起一个通知,在多处监听此通知。比如说一个App的主题样式被修改,就可以通过此类来通知多个相关UI,做响应的处理。
如下案例展示了这种可能: import UIKit @UIApplicationMain …

Swift iOS: View
详解


View 视图类 UIView
定义了一个矩形区域,并且管理此用户界面内的交互。视图可以管理子视图,全部子视图和自身视图一起,构成一个层次化的视图树。
我们完成一个案例,代码可以创建两个 50
见方的矩形,它们并排在一起,并且还有第三个视图,它嵌入在第二个视图内。三个视图的背景色分别为…

详解 View
Controller



UIViewController,它被称为视图控制器,被用来装入和释放视图、管理视图交互、并且和其他视图控制器一起协作完成整体的
App 界面。为了术语一致,后文会直接使用它的英文名:View Controller。 View
Controller 管理一个视图层级体系。比如在一个…

Node.js: 一个刚刚够用的 HTTPS
服务器


有时候,需要创建一个https服务器,以便测试使用。使用node.js完成此项工作还是比较简单的。另外,为了可以创建https,需要openssl工具栈。
首先创建证书: openssl genrsa -out key.pem openssl req -new -key key…

git : 修正HEAD
detached状态


有时候发现当前代码修改的不对了,想要回溯到前些版本,多次checkout查找合适版本时,会发现当前处于这样的状态;
(HEAD detached from
REVISION-ID)如果此时做了修改,那么可以使用如下命令合并修改到主分支: git
branch temp git c…

Swift iOS : @escaping
属性


使用闭包,有两种情况,一种是在调用者完成前闭包就被执行完成了。还有一种则相反:调用函数完成了,但是闭包还没有被调用或者没有被完成。后者被称为逃逸闭包。
所有网络请求的函数,在完成调用请求后,直到响应返回,闭包才会被调用,所以这个类型的网络请求函数内等待响应的闭包就是逃逸闭包。这…

Swift iOS :
内存管理


Swift 是自动管理内存的。这意味着,你不需要主动释放内存。 比如 Foo
内包含的 Bar,可以随同 Foo 一起被释放: import UIKit @UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDele…

Swift iOS :
抽屉效果


可以使用DrawerController框架实现抽屉的效果。看起来还是蛮帅气的。
需要做的就是一个DrawerController,3个ViewController。3个ViewController分别用于左侧的抽屉,当前的抽屉,右侧的抽屉。DrawerController用来…

在 C 系语言中,程序的入口都是 main 函数。对于一个 Objective-C 的 iOS app
项目,在新建项目时, Xcode 将帮我们准备好一个 main.m 文件,其中就有这个
main 函数:

demo 中所需要的类

int main(int argc, char * argv[]) {

                @autoreleasepool {

                   return UIApplicationMain(argc, argv,
nil,NSStringFromClass([AppDelegate class]));

                }

}

图片 1

在这里我们调用了 UIKit 的 UIApplicationMain
方法。这个方法将根据第三个参数初始化一个 UIApplication
或其子类的对象并开始接收事件 (在这个例子中传入 nil,意味使用默认的
UIApplication)。最后一个参数指定了 AppDelegate
类作为应用的委托,它被用来接收类似 didFinishLaunching 或者
didEnterBackground
这样的与应用生命周期相关的委托方法。另外,虽然这个方法标明为返回一个
int,但是其实它并不会真正返回。它会一直存在于内存中,直到用户或者系统将其强制终止。

屏幕快照 2016-06-14 下午8.21.32.png

了解了这些后,我们就可以来看看 Swift 的项目中对应的情况了。新建一个
Swift 的 iOS app 项目后,我们会发现所有文件中都没有一个像 Objective-C
时那样的 main 文件,也不存在 main 函数。唯一和 main 有关系的是在默认的
AppDelegate 类的声明上方有一个 @UIApplicationMain 的标签。

以下是各个类的代码:
1.主要是设置根视图控制器 AppDelegate.swift

不说可能您也已经猜到,这个标签做的事情就是将被标注的类作为委托,去创建一个
UIApplication
并启动整个程序。在编译的时候,编译器将寻找这个标记的类,并自动插入像
main 函数这样的模板代码。我们可以试试看把 @UIApplicationMain
去掉会怎么样:

import UIKit

Undefined symbols _main

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

说明找不到 main 函数了。

var window: UIWindow?


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    window?.rootViewController = UINavigationController(rootViewController: ViewController())

    return true
}

在一般情况下,我们并不需要对这个标签做任何修改,但是当我们如果想要使用
UIApplication 的子类而不是它本身的话,我们就需要对这部分内容 “做点手脚”
了。

2.创建 model Contact.swift

刚才说到,其实 Swift 的 app 也是需要 main 函数的,只不过默认情况下是
@UIApplicationMain 帮助我们自动生成了而已。和 C 系语言的 main.c 或者
main.m 文件一样,Swift 项目也可以有一个名为 main.swift
特殊的文件。在这个文件中,我们不需要定义作用域,而可以直接书写代码。这个文件中的代码将作为
main 函数来执行。比如我们在删除 @UIApplicationMain 后,在项目中添加一个
main.swift 文件,然后加上这样的代码:

import UIKit

UIApplicationMain(C_ARGC, C_ARGV,
nil,NSStringFromClass(AppDelegate))

class Contact: NSObject {

现在编译运行,就不会再出现错误了。当然,我们还可以通过将第三个参数替换成自己的
UIApplication
子类,这样我们就可以轻易地做一些控制整个应用行为的事情了。比如将
main.swift 的内容换成:

var name:String?
var age:String?
var gender:String?
var phone:String?

init(name:String,age:String,gender:String,phone:String) {
    super.init()
    self.name = name
    self.age = age
    self.gender = gender
    self.phone = phone
}

import UIKit

class MyApplication: UIApplication {

           override func sendEvent(event: UIEvent) {

                  super.sendEvent(event)

                 println(“Event sent: \(event)”);

        }

}

UIApplicationMain(C_ARGC,C_ARGV,NSStringFromClass(MyApplication),
NSStringFromClass(AppDelegate))

}

这样每次发送事件 (比如点击按钮) 时,我们都可以监听到这个事件了。

3.创建单例

import UIKit

class ContactMangager: NSObject {

// 将联系人管理声明为单例类,管理所有联系人的操作,增删...
static let shareContactManager:ContactMangager = {
    let contactManager = ContactMangager()
    return contactManager
}()

// 所有联系人的数组
var contactArray:[Contact] = [Contact]()
func addContact(contact:Contact){
    contactArray.append(contact)
}

}

4.用 xib 拖 cell 布局,并拖成属性和赋值

图片 2

屏幕快照 2016-06-14 下午8.25.46.png

import UIKit

class ContactTableViewCell: UITableViewCell {

@IBOutlet var nameL: UILabel!

@IBOutlet var ageL: UILabel!

@IBOutlet var genderL: UILabel!

@IBOutlet var phoneL: UILabel!

// 根据 contact 给 cell 里面的标签赋值
func cellWithContact(contact:Contact){
    nameL.text = contact.name
    ageL.text = contact.age
    genderL.text = contact.gender
    phoneL.text = contact.phone
}

5.联系人详情页面 xib 拖,并拖成属性

图片 3

屏幕快照 2016-06-14 下午8.26.40.png

import UIKit

class DetailViewController: UIViewController {

@IBOutlet var nameL: UILabel!

@IBOutlet var ageL: UILabel!

@IBOutlet var genderL: UILabel!

@IBOutlet var phoneL: UILabel!

var contact:Contact?


override func viewDidLoad() {
    super.viewDidLoad()

    nameL.text = contact?.name
    ageL.text = contact?.age
    genderL.text = contact?.gender
    phoneL.text = contact?.phone


}

6.添加联系人页面 xib 拖 ,并拖成属性

图片 4

屏幕快照 2016-06-14 下午8.27.45.png

import UIKit

class AddViewController: UIViewController {

@IBOutlet var nameTF: UITextField!

@IBOutlet var ageTF: UITextField!

@IBOutlet var genderTF: UITextField!

@IBOutlet var phoneTF: UITextField!

// 闭包
var closure:((model:Contact)->())?

// 保存按钮
func saveAction(rightBarButtonItem:UIBarButtonItem){
    let contact = Contact(name: nameTF.text!, age: ageTF.text!, gender: genderTF.text!, phone: phoneTF.text!)
    closure!(model:contact)
    ContactMangager.shareContactManager.addContact(contact)
    navigationController?.popViewControllerAnimated(true)
}

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Save, target: self, action: "saveAction:")

}

7.在根视图控制器中进行一系列操作
import UIKit

 // 延展(写在类的外面)
// extension 本类名:协议名{}
 extension    ViewController:UITableViewDelegate,UITableViewDataSource{

// tableview 遵守的协议方法
// 返回 cell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // cell 需要强转
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ContactTableViewCell
    let contact = ContactMangager.shareContactManager.contactArray[indexPath.row]
    cell.cellWithContact(contact)
    return cell
}
// 行数
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return ContactMangager.shareContactManager.contactArray.count
}
// 行高
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 110
}

// cell 点击方法,点击查看详情
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let detailVC:DetailViewController = DetailViewController()
    detailVC.contact = ContactMangager.shareContactManager.contactArray[indexPath.row]
    navigationController?.pushViewController(detailVC, animated: true)
}

// 是否可编辑
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}
// 相应编辑模式下的操作
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete{
        // 删除 cell
        [ContactMangager.shareContactManager.contactArray.removeAtIndex(indexPath.row)]
        // 操作 UI
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
    }
}

}

class ViewController: UIViewController {

// 懒加载 tableview
lazy var tableView:UITableView = {
    let tableView = UITableView(frame: UIScreen.mainScreen().bounds, style: UITableViewStyle.Plain)
    tableView.delegate = self
    tableView.dataSource = self
    return tableView
}()


// 添加按钮
func addAction(leftBarButtonItem:UIBarButtonItem){
    let addVC:AddViewController = AddViewController()
    addVC.closure = {
        (model:Contact)->()
        in
        ContactMangager.shareContactManager.contactArray.append(model)
        self.tableView.reloadData()
    }
    navigationController?.pushViewController(addVC, animated: true)
}

override func viewDidLoad() {

     super.viewDidLoad()

    // 注册cell
    tableView.registerNib(UINib(nibName: "ContactTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier: "cell")


    view.addSubview(tableView)
    view.backgroundColor = UIColor.whiteColor()
    // 数据源
    for i in 0..<10
    {
        let contact = Contact(name: "lisi\(i)", age: "2\(i)", gender: "女", phone: "120-2016\(i)")
        ContactMangager.shareContactManager.addContact(contact)
    }

    navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "addAction:")         
}

}

相关文章