根目录下的build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
google()

//代码托管库,设置后可以在项目中引用jcenter上的开源项目
jcenter()
}


//引用anroid插件
dependencies {

//声明gradle插件,插件版本号
classpath 'com.android.tools.build:gradle:3.5.3'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
jcenter()

}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

app目录下的build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266

//声明是Android应用程序还是库模块
//com.android.appliccation 标识应用程序,可以直接运行
//com.android.library 标识这是一个库模块,依附于别的应用程序运行

apply plugin: 'com.android.application'


//配置项目构建的各种属性
android {

//程序在编译时会检查lint,有任何错误提示会停止build,我们可以关闭这个开关
lintOptions{
//即使报错也不会停止打包
abortOnError false
//打包release版本的时候是否进行检测
checkReleaseBuilds false
}


//编译SDK的版本,也就是API Level
compileSdkVersion 28
//build tools的版本,其中包括了打包工具aapt 、 dx
//这个目录工具位于 sdk目录/build-tools/ 下
buildToolsVersion '28.0.3'


//关闭Android Studio的PNG合法性检查
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false

//默认配置
defaultConfig {
//应用程序的包名
applicationId "com.ifeiyv.android001"

//最小的SDK版本,如果设置小于这个版本,或者大于maxSdkVersion将无法安装这个应用
minSdkVersion 19

//目标sdk版本,充分测试过的版本(建议版本)
targetSdkVersion 28

//版本号 每次更新增减
versionCode 1

//版本号,用户看到的版本号
versionName "1.0"

//指定打包成Jar文件时候的文件名称
archivesBaseName = "demo-$versionName"


//Native Development Kit
//原生开发工具包是一组可以让您在Android应用中利用C和c++代码的工具,可用以从您自己的源代码构建,或者利用现有的预构建库.
ndk{
//设置(so)文件名称
moduleName "testfeiyv"
ldLibs "log","z","m","jnigraphics","android"

//显示指定支持的ABIs
abiFilters "armeabi","x86","armeabi-v7a"

//C++11
cFlags "-sd=c++11 -fexceptions"

stl "gnustl_static"
}

//当方法数超过65535的时候允许打包成多个dex文件,动态加载dex
//(方法的索引使用的是一个short值,而short最大值是65535)
multiDexEnabled true

//Instrumentation单元测试
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

sourceSets{
main{
//指定清单文件
manifest.srcFile 'AndroidManifest.xml'
//指定res资源目录
res.srcDirs = ['res']
//asset资源文件
assets.srcDir = ['assets']
//jni代码目录
jni.srcDirs 'src/main/jni'
//jni库目录
jniLibs.srcDir 'src/main/jniLibs'
//指定Java源代码目录
java.srcDirs = ['src']
//指定resource目录
resources.srcDirs = ['src']
//指定aidl目录
aidl.srcDirs = ['src']
//指定source目录
renderscript.srcDirs = ['src']
}

//指定debug模式的路径
debug.setRoot('build-types/debug')
//指定release模式的路径
release.setRoot('build-types/release')
}

//mltiDex的一些相关配置,这样配置可以使编译速度更快
dexOptions{
//让它不要对Lib做preDexing
preDexLibraries = fasle
//开启incremental dexing,优化编译效率。这个功能Android Studio默认是关闭的
incremental true
//增加java堆内存大小
javaMaxHeapSize "4g"
}

//签名配置
signingConfigs{
release{
//密钥文件路径
storeFile file("feiyv.keystore")
//密钥文件密码
storePassword "feiyvpwd"
//key 别名
keyAlias "fy"
//key密码
keyPassword "fypwd"
}
debug{
//密钥文件路径
storeFile file("feiyv.keystore")
//密钥文件密码
storePassword "feiyvpwd"
//key 别名
keyAlias "fy"
//key密码
keyPassword "fypwd"
}
}


//指定生成安装文件的配置,常有两个子包:release,debug,注:直接运行的都是debug安装文件
buildTypes {
//release版本的配置,即生成发布版文件的配置
release {
//是否支持zip
zipAlignEnabled true
//移除无用的resource文件
shrinkResources true
//是否对代码进行混淆,true标识混淆
minifyEnabled false

//指定混淆时使用的规则文件:
//proguard-android.tex指所有项目通用的混淆规则,proguard-rules.pro当前项目特有的混淆规则
//release的Proguard默认为Module下的proguard-rules.pro文件
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

//是否支持调试
debuggable false

//ndk的一些配置
ndk {
// cFlags "-std=c++11 -fexceptions -O3 -D__RELEASE__" // C++11
// platformVersion = "19"
moduleName "hebbewifisafe" // 设置库(so)文件名称
ldLibs "log", "z", "m", "jnigraphics", "android"
// 引入库,比如要用到的__android_log_print
abiFilters "armeabi", "x86", "armeabi-v7a"// "x86"
cFlags "-std=c++11 -fexceptions" // C++11
stl "gnustl_static"
}
// 采用动态替换字符串的方式生成不同的 release.apk (3.0之后版本的修改方式)
applicationVariants.all { variant ->
variant.outputs.all { output ->
if (!variant.buildType.isDebuggable()) {
// 获取签名的名字 variant.signingConfig.name
// 要被替换的源字符串
def sourceFile = "app-release";
// 替换的字符串
               def replaceFile = "Demo-V${variant.versionName}.${releaseTime()}"
               outputFileName = output.outputFile.name.replace(sourceFile, replaceFile)
}
}
}
jniDebuggable false // 关闭jni调试
}
debug { // debug版本的配置
minifyEnabled false
zipAlignEnabled true
shrinkResources true // 移除无用的resource文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debuggable true
// jniDebuggable true
ndk {
cFlags "-std=c++11 -fexceptions -g -D __DEBUG__" // C++11
}
jniDebuggable true
}

}



productFlavors{
//这里可以设置产品发布的一些东西
//比如一种软件要发布到不同的渠道
//且不同渠道中的包名不同,可以在此处
//甚至可以设置不同的AndroidManifest.xml
tencent{

}
huanwei{

}
all{

}
}


// 所谓ProductFlavors其实就是可定义的产品特性,
// 配合 manifest merger 使用的时候就可以达成在一次编译
// 过程中产生多个具有自己特性配置的版本。
// 这个配置的作用就是,为每个渠道包产生不同的 UMENG_CHANNEL_VALUE 的值。
productFlavors.all{
flavor -> flavor.manifestPlaceholder = [UMENG_CHANNEL_VALUE:name]
}



// 指定当前项目的所有依赖关系:本地依赖、库依赖、远程依赖
// 本地依赖:可以对本地 Jar 包或目录添加依赖关系
// 库依赖:可以对项目中的库模块添加依赖关系
// 远程依赖:可以对 jcenter 库上的开源项目添加依赖
// 标准的远程依赖格式是 域名:组织名:版本号

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:recyclerview-v7:28.0.0'
// implementation 'androidx.appcompat:appcompat:1.0.2'
// implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
// androidTestImplementation 'androidx.test.ext:junit:1.1.0'
// androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

}


// 声明是要使用谷歌服务框架
apply plugin: 'com.google.gms.google-services'


// 第三方依赖库的本地缓存路径
task showMeCache << {
configurations.compile.each { println it }
}

// 使用maven仓库。android有两个标准的library文件服务器,一个jcenter一个maven。两者毫无关系。
// jcenter有的maven可能没有,反之亦然。
// 如果要使用jcenter的话就把mavenCentral()替换成jcenter()
repositories {
mavenCentral()
}


def releaseTime() {
return new Date().format("MMdd.HHmm")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
//
// LayoutProperties.swift
// IfeiyvSwift
//
// Created by l on 2019/6/12.
// Copyright © 2019 ifeiyv. All rights reserved.
//

import UIKit
import CommonCrypto

//Mark:------------Layout
struct Screen{

//MARK:屏幕宽度
static var width:CGFloat{
return UIScreen.main.bounds.width
}
//MARK:屏幕高度
static var height:CGFloat{
return UIScreen.main.bounds.height
}
//MARK:分辨率 倍率
static var scale:CGFloat{
return Screen.width/375.0
}
}


extension UIView{

//MARK: 设置或者获取UIView的frame
var fy_frame:CGRect{
set{
self.frame = fy_frame
}
get{
return self.frame
}
}

//MARK: 设置或者获取UIView的origin
var fy_origin:CGPoint{
set{
self.frame = CGRect(x: fy_origin.x, y: fy_origin.y, width: self.fy_width, height: self.fy_height)
}
get{
return self.frame.origin
}
}

//MARK: 设置或者获取UIView的size
var fy_size:CGSize{
set{
self.frame = CGRect(x: self.fy_origin.x, y: self.fy_origin.y, width: fy_size.width, height: fy_size.height)
}
get{
return self.frame.size
}
}


//MARK: 设置或者获取UIView的宽度
var fy_width:CGFloat{
set{
self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: fy_width, height: self.frame.size.height)
}
get{
return self.bounds.size.width
}
}

//MARK: 设置或者获取UIView的宽度
var fy_height:CGFloat{
set{
self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width, height: fy_height)
}
get{
return self.bounds.size.height
}
}


//MARK: 设置或者获取UIView的x坐标
var fy_x:CGFloat{
set{
self.frame = CGRect(x: fy_x, y: self.frame.origin.y, width: self.frame.size.width, height: self.frame.size.height)
}
get{
return self.frame.origin.x
}
}

//MARK: 设置或者获取UIView的y坐标
var fy_y:CGFloat{
set{
self.frame = CGRect(x: self.frame.origin.x, y: fy_y, width: self.frame.size.width, height:self.frame.size.height)
}
get{
return self.frame.origin.y
}
}


//MARK: 设置或者获取UIView的maxX坐标
var fy_maxX:CGFloat{
get{
return self.fy_x+self.fy_width
}
}

//MARK: 设置或者获取UIView的maxY坐标
var fy_maxY:CGFloat{
get{
return self.fy_y+self.fy_height
}
}

}

extension UIView{
//MARK: 切圆角
func corner(byRoundingCorners corners: UIRectCorner, radii: CGFloat) {
let maskPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radii, height: radii))
let maskLayer = CAShapeLayer()
maskLayer.frame = self.bounds
maskLayer.path = maskPath.cgPath
self.layer.mask = maskLayer
}
}




enum FYError: Swift.Error {
case NOFINT
}

extension UINib{
//MARK: 加载XIB
public class func readNibView(str: String) throws -> UIView {
let nib = UINib.init(nibName: str, bundle: nil)
if let view = nib.instantiate(withOwner: nil, options: nil).first as? UIView {
return view
}
throw FYError.NOFINT
}
}


//Mark:------------UIColor
extension UIColor{

func fy_RGB(red:CGFloat,green:CGFloat,blue:CGFloat) -> UIColor {
return fy_RGBA(red: red, green: green, blue: blue, alpha: 1.0)
}
func fy_RGBA(red:CGFloat,green:CGFloat,blue:CGFloat,alpha:CGFloat) -> UIColor {
return UIColor.init(red: red/255.0, green: green/255.0, blue: blue/255.0, alpha: alpha)
}

func fy_hexColor(hexColor:String,defaultStringColor:String = "000000",alpha:CGFloat = 1.0) -> UIColor {
var cString: String = hexColor.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)

if cString.count < 6 {
cString = defaultStringColor
}
if cString.hasPrefix("0X") || cString.hasPrefix("0x") {
cString = String(cString.suffix(from: cString.index(cString.startIndex, offsetBy: 2)))
}
if cString.hasPrefix("#") {
cString = String(cString.suffix(from: cString.index(cString.startIndex, offsetBy: 1)))
}
if cString.count != 6 {
cString = defaultStringColor
}

var range: NSRange = NSMakeRange(0, 2)
let rString = (cString as NSString).substring(with: range)
range.location = 2
let gString = (cString as NSString).substring(with: range)
range.location = 4
let bString = (cString as NSString).substring(with: range)

var r: UInt32 = 0x0
var g: UInt32 = 0x0
var b: UInt32 = 0x0
Scanner(string: rString).scanHexInt32(&r)
Scanner(string: gString).scanHexInt32(&g)
Scanner(string: bString).scanHexInt32(&b)
return fy_RGBA(red: CGFloat(r), green: CGFloat(g), blue: CGFloat(b), alpha: alpha)
}

}

//Mark:------------String
extension String{

static let EMPTY = ""
/// String使用下标截取字符串
/// 例: "示例字符串"[0..<2] 结果是 "示例"
subscript (r: Range<Int>) -> String {
get {
let startIndex = self.index(self.startIndex, offsetBy: r.lowerBound)
let endIndex = self.index(self.startIndex, offsetBy: r.upperBound)

return String(self[startIndex..<endIndex])
}
}

//MARK: 返回一个字符串的前n位, 若字符串长不足n,则直接返回当前字符串
func fy_start(length n: Int) -> String {
if self.count < n {
return self
}
if n < 0 {
return self
}
let index = self.index(self.startIndex, offsetBy: n)
return String(self[..<index])
}


//MARK: 返回一个字符串的后n位, 若字符串长不足n,则直接返回当前字符串
func fy_last(length n: Int) -> String {
if self.count < n {
return self
}
let index = self.index((self.endIndex), offsetBy: -n)
return String(self[index...])
}

//MARK: 删除所有的空格
func fy_trimAll() -> String {
return self.replacingOccurrences(of: " ", with: String.EMPTY)
}


//MARK: 判断是否包含数字和字母
func fy_isPassWord() -> Bool {
let numberRegex:NSPredicate = NSPredicate(format: "SELF MATCHES %@", "^.*[0-9]+.*$")

let letterRegex:NSPredicate = NSPredicate(format: "SELF MATCHES %@", "^.*[A-Za-z]+.*$")

if numberRegex.evaluate(with: self) && letterRegex.evaluate(with: self){
return true
}
return false
}


//MARK: md5加密
var fy_md5: String {
let cStr = self.cString(using: .utf8)
let digestLen = Int(CC_MD5_DIGEST_LENGTH)
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: digestLen)
CC_MD5(cStr!,(CC_LONG)(strlen(cStr!)), buffer)

let md5String = NSMutableString()
for i in 0 ..< digestLen {
md5String.appendFormat("%02X", buffer[i])
}
free(buffer)
return md5String as String
}

//MARK: base64编码
var fy_base64Encoding: String {
let data = self.data(using: String.Encoding.utf8)
var base64String = data?.base64EncodedString(options: .lineLength76Characters)
base64String = base64String?.replacingOccurrences(of: "\r", with: "")
return base64String ?? ""
}

//MARK: base64解码
var fy_base64Decoded: String {

let decodedData = Data(base64Encoded: self, options: Data.Base64DecodingOptions(rawValue: 0))
return String(data: decodedData!, encoding: String.Encoding.utf8) ?? ""
}

//MARK: 返回188****8888类型字符串
func fy_getSecretMobileNo() -> String {
if self.isEmpty { return self }
if self.count > 7 {
return "\(self.fy_start(length: 3))****\(self.fy_last(length:4))"
}else{
return self;
}
}


//MARK: 截取从start开始,长度为lenght的字符串
///
/// - Parameters:
/// - start: 开始
/// - lenght: 长度
/// - Returns: 处理结果
func fy_startIndexToLenght(_ start: Int, lenght: Int) -> String {
if start > self.count {
return self
}
let startIndex = self.index(self.startIndex, offsetBy: start)
if self.count < (start + lenght) {
return String(self.suffix(from: startIndex))
}
let endIndex = self.index(self.startIndex, offsetBy: start + lenght)
return String(self[startIndex..<endIndex])
}

//MARK: 判断链接中是否存在中文
func fy_isIncludeChineseIn() -> Bool {
for(_, value) in self.enumerated() {
if value >= "\u{4E00}" && value <= "\u{9FA5}" {
return true
}
}
return false
}

//MARK: 判断是否有效邮箱
///
/// - Returns: 结果
func fy_isPeriodEmail() -> Bool {
let email = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let regextestEmails = NSPredicate(format: "SELF MATCHES %@", email)

return regextestEmails.evaluate(with: self)
}

//MARK: 判断是否有效身份证号
///
/// - Returns: Bool
func fy_isPeriodIdCard() -> Bool {

if self.count != 18 {
return false
}

let regex2 = "^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$"
let identityCardPredicate = NSPredicate(format: "SELF MATCHES %@", regex2)
let flag = identityCardPredicate.evaluate(with: self)
if !flag {
// 格式错误
return flag
} else {
// 格式正确,判断合法性
// 将前十七位加权因子保存在数组里
let idCardWiArray = ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"]
// 这是除以11后,可能产生的11位余数, 验证码,也保存在数组里
let idCardYArray = ["1", "0", "10", "9", "8", "7", "6", "5", "4", "3", "2"]
var idCardArr = [Int]()
var idCardWiSum = 0
for index in 0..<17 {
let subStrIndex = fy_startIndexToLenght(index, lenght: 1)
let idCardWiIndex = idCardWiArray[index]
// 数组保存所有乘积
idCardArr.append(Int(subStrIndex)! * Int(idCardWiIndex)!)
}

// 将所有乘积相加
for index in 0..<idCardArr.count {
idCardWiSum += idCardArr[index]
}

// 计算出校验码所在数组的位置
let idCardMod = idCardWiSum % 11
// 得到最后一位身份证号码
let idCardLast = fy_startIndexToLenght(17, lenght: 1)
if idCardMod == 2 {
if idCardLast == "X" || idCardLast == "x" {
return true
} else {
return false
}
} else {
if idCardLast == idCardYArray[idCardMod] {
return true
} else {
return false
}
}
}
}

//MARK: 正则匹配6-12位数字和大小写字母组合
///
/// - Returns: Bool
func fy_checkPassword() -> Bool {
let password = "^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,12}"
let regextestPassword = NSPredicate(format: "SELF MATCHES %@", password)
return regextestPassword.evaluate(with:self)
}

//MARK: 判断字符串是否包含其他字符串(必须全部一样)
func fy_contains(find: String) -> Bool{
return self.range(of: find) != nil
}

//MARK: 字符串转换成整型
func fy_toInt() -> Int? {
return Int(self)
}

//MARK: 识别有效手机号
func fy_verifyPhoneNumber() -> Bool {
let mobile = "^1((3[0-9]|4[5-68-9]|5[0-35-9]|6[6]|7[0-9]|8[0-9]|9[89])\\d{8}$)"
let regextestmobile = NSPredicate(format: "SELF MATCHES %@",mobile)
return regextestmobile.evaluate(with: self)
}

//MARK: 识别是否有效座机号 eg: 021-8688995
func fy_landlineNumber() -> Bool {
let strNum = "^(0\\d{2,3}-?\\d{7,8}$)"
let checktest = NSPredicate.init(format: "SELF MATCHES %@", strNum)
let isPhone = checktest.evaluate(with: self)

let strNum1 = "^(\\d{7,8}$)"
let checktest1 = NSPredicate.init(format: "SELF MATCHES %@", strNum1)
let isPhone1 = checktest1.evaluate(with: self)

if isPhone || isPhone1 {
return true
} else {
return false
}
}


}





extension Array{
//MARK: 数组转JSON字符串
func arrayToString() -> String? {
if let data = try? JSONSerialization.data(withJSONObject: self, options: JSONSerialization.WritingOptions.init(rawValue: 0)) {
if let jsonStr = String.init(data: data, encoding: String.Encoding.utf8) {
return jsonStr
}
}
return nil
}
}

@discardableResult

修饰的方法有返回值,调用时可以不接收返回值,并且不会出现警告⚠️

IBInspectable

属性声明的时候加上 IBInspectable 修饰,Xcode 会自动添加到 Storyboard 中 Attributes inspector 栏目中

typealias

定义了一个类型别名

UITableBarController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#import "AppDelegate.h"
#import "RootViewController.h"
#import "ViewController1.h"
#import "ViewController2.h"
#import "ViewController3.h"
#import "ViewController4.h"
#import "ViewController5.h"
#import "ViewController6.h"
@interface AppDelegate ()<UITabBarControllerDelegate>
@end
/**
系统代理的使用:
1.遵守协议
2.设置代理
3.实现代理方法
*/
@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
[self.window setBackgroundColor:[UIColor whiteColor]];

[self createTabBarController];

[self.window makeKeyAndVisible];
return YES;
}
//创建UITabBarController
-(void)createTabBarController{
// 初始化UITabBarController
UITabBarController *tabBarVc = [[UITabBarController alloc]init];

// 设置代理
tabBarVc.delegate = self;

self.window.rootViewController = tabBarVc;

// 设置tabBar的背景色
// tabBarVc.tabBar.barTintColor = [UIColor yellowColor];

ViewController1 *vc1 = [[ViewController1 alloc]init];
ViewController2 *vc2 = [[ViewController2 alloc]init];
ViewController3 *vc3 = [[ViewController3 alloc]init];
ViewController4 *vc4 = [[ViewController4 alloc]init];
ViewController5 *vc5 = [[ViewController5 alloc]init];
ViewController6 *vc6 = [[ViewController6 alloc]init];

// 系统item样式
// UITabBarSystemItemMore,
// UITabBarSystemItemFavorites,
// UITabBarSystemItemFeatured,
// UITabBarSystemItemTopRated,
// UITabBarSystemItemRecents,
// UITabBarSystemItemContacts,
// UITabBarSystemItemHistory,
// UITabBarSystemItemBookmarks,
// UITabBarSystemItemSearch,
// UITabBarSystemItemDownloads,
// UITabBarSystemItemMostRecent,
// UITabBarSystemItemMostViewed,


UITabBarItem *item1 = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:11];
vc1.tabBarItem = item1;

UITabBarItem *item2 = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemContacts tag:12];
vc2.tabBarItem = item2;

UITabBarItem *item3 = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:13];
vc3.tabBarItem = item3;

UITabBarItem *item4 = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:14];
vc4.tabBarItem = item4;

UITabBarItem *item5 = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:15];
vc5.tabBarItem = item5;

UITabBarItem *item6 = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemHistory tag:16];
vc6.tabBarItem = item6;

// 镂空处颜色
tabBarVc.tabBar.tintColor = [UIColor redColor];

// 透明度
tabBarVc.tabBar.translucent = NO;

// 最多只显示5个,多出来的会自动生成一个More,它是一个导航控制器
tabBarVc.viewControllers = @[vc1,vc2,vc3,vc4,vc5,vc6];

// 设置选中哪一个控制器
// tabBarVc.selectedIndex = 3;

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSUInteger index = [defaults integerForKey:@"index"];
NSLog(@"%ld",index);
// 设置选中第index个控制器
tabBarVc.selectedIndex = index;

// 排序
[self order];
}
#pragma mark -
#pragma mark UITabBarController delegate
-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
NSLog(@"将要选中视图控制器");
if (viewController.tabBarItem.tag == 13) {
return NO;
}
// YES:可以选中
// NO:不能选中
return YES;
}
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
NSLog(@"已经选中指定的视图控制器");

NSArray *array = tabBarController.viewControllers;
NSLog(@"array = %@",array);
NSUInteger index = [array indexOfObject:viewController];

// 初始化NSUserDefaults (单例)
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 设置index
[defaults setInteger:index forKey:@"index"];
// 同步
[defaults synchronize];
}
-(void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers{
NSLog(@"willBeginCustomizingViewControllers");
}
-(void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
NSLog(@"willEndCustomizingViewControllers");
}
-(void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
NSLog(@"didEndCustomizingViewControllers");

NSMutableArray *array = [NSMutableArray array];
// changed用来判断是否交换
if (changed == YES) {
for (UIViewController *vc in viewControllers) {
[array addObject:vc.title];
}
}
NSLog(@"%@",array);

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:array forKey:@"order"];
[defaults synchronize];
}

-(void)order{

// 获取UITabBarController
UITabBarController * tbc = (UITabBarController*)self.window.rootViewController;

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 取得之前排序的数组
NSMutableArray *titleArray = [defaults objectForKey:@"order"];

// 如果排序的数组是nil,返回
if (titleArray == nil) {
return;
}

NSMutableArray *orderArray = [NSMutableArray array];
for (NSString *titler in titleArray) {
for (UIViewController *vc in tbc.viewControllers) {
if ([titler isEqualToString:vc.title]) {
[orderArray addObject:vc];
break;
}
}
}
tbc.viewControllers = orderArray;
}

@end


#import "BaseViewController.h"

@interface BaseViewController ()

@end

@implementation BaseViewController
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = NSStringFromClass([self class]);
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];

#define Random arc4random()%256/255.0

self.view.backgroundColor = [UIColor colorWithRed:Random green:Random blue:Random alpha:0.9f];

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 200, 100)];
NSString *name = NSStringFromClass([self class]);
label.text = name;

[self.view addSubview:label];
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#import "AppDelegate.h"
#import "ViewController1.h"
#import "ViewController2.h"
#import "ViewController3.h"
#import "ViewController4.h"
#import "ViewController4_1.h"
@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
[self.window setBackgroundColor:[UIColor whiteColor]];

[self createUITabBarController];
[self customTabBar];


[self.window makeKeyAndVisible];

return YES;
}
//创建UITabBarController
-(void)createUITabBarController{
// 初始化UITabBarController
UITabBarController *tabBarVc = [[UITabBarController alloc]init];
self.window.rootViewController = tabBarVc;


ViewController1 *vc1 = [[ViewController1 alloc]init];
ViewController2 *vc2 = [[ViewController2 alloc]init];
ViewController3 *vc3 = [[ViewController3 alloc]init];

ViewController4 *vc4 = [[ViewController4 alloc]init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc4];

// 把导航控制器放到分栏控制器中
// tabBarVc.viewControllers = @[vc1,vc2,vc3,nav];

// 初始化UITabBarItem
// Title:名字
// image:图片
// tag:标识
UITabBarItem *item1 = [[UITabBarItem alloc]initWithTitle:@"微信" image:[UIImage imageNamed:@"tabbar_mainframe" ] tag:11];
vc1.tabBarItem = item1;

UIImage *image2 = [UIImage imageNamed:@"tabbar_contactsHL"];
// 对图片进行处理(显示原有尺寸)
image2 = [image2 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
//
//Title:名称
//image:正常状态image
//selectedImage:选中状态image(需要对图片进行处理,否则会不显示选中图片)
UITabBarItem *item2 = [[UITabBarItem alloc]initWithTitle:@"通讯录" image:[UIImage imageNamed:@"tabbar_contacts"] selectedImage:image2];
vc2.tabBarItem = item2;

UIImage *image3 = [UIImage imageNamed:@"tabbar_discoverHL"];
image3 = [image3 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UITabBarItem *item3 = [[UITabBarItem alloc]initWithTitle:@"朋友圈" image:[UIImage imageNamed:@"tabbar_discover"] selectedImage:image3];
vc3.tabBarItem = item3;

item3.badgeValue = @"99+";


UIImage *image4 = [UIImage imageNamed:@"tabbar_meHL"];
image4 = [image4 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

UITabBarItem *item4 = [[UITabBarItem alloc]initWithTitle:@"我" image:[UIImage imageNamed:@"tabbar_me"] selectedImage:image4];
vc4.tabBarItem = item4;

tabBarVc.viewControllers = @[vc1,vc2,vc3,nav];
}
//设置TabBar
-(void)customTabBar{
// 获取UITabBarController
UITabBarController *tabBarVc = (UITabBarController*)self.window.rootViewController;

// 获取UITabBar
UITabBar *tabBar = tabBarVc.tabBar;

// 设置tabBar样式
tabBar.barStyle = UIBarStyleDefault;
// UIBarStyleDefault
// UIBarStyleBlack

// 设置透明度
tabBar.translucent = YES;

// 设置镂空颜色(字体颜色)
[tabBar setTintColor:[UIColor colorWithRed:0/255.0 green:176/255.0 blue:15/255.0 alpha:1.0]];

// 设置tabBar背景色
[tabBar setBarTintColor:[UIColor redColor]];

// 设置背景图片(当设置背景图片时,会覆盖背景色)
[tabBar setBackgroundImage:[UIImage imageNamed:@"tabbar_bg"]];

}

@end


#import "BaseViewController.h"

@interface BaseViewController ()

@end

@implementation BaseViewController
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = NSStringFromClass([self class]);
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];

#define Random arc4random()%256/255.0

self.view.backgroundColor = [UIColor colorWithRed:Random green:Random blue:Random alpha:0.9f];

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 200, 100)];

NSString *name = NSStringFromClass([self class]);
label.text = name;

[self.view addSubview:label];
}
@end

#import "ViewController4.h"
#import "ViewController4_1.h"
@interface ViewController4 ()

@end

@implementation ViewController4

- (void)viewDidLoad {
[super viewDidLoad];

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100, 100, 100);
button.backgroundColor = [UIColor lightGrayColor];
[button addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
-(void)onClick{
ViewController4_1 *vc = [[ViewController4_1 alloc]init];
[self.navigationController pushViewController:vc animated:YES];

NSLog(@"%f",self.tabBarController.tabBar.frame.size.height);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}



@end

vim常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
打开语法高亮	:syntax on	
关闭语法高亮 :syntax off
显示行数 :set nu
取消显示行数 :set nonu

跳转到某一行 :123
跳转到第一行首 ESC+gg
跳转到最后一行 ESC+G

全部复制 ggyG
全部删除 ggdG
代码对齐 gg=G

自动补全 Ctrl + p (编辑模式下)

vim 配置文件和自动对齐
.vimrc
vim 设置显示文件自动显示颜色
.bash_profile

UIWebView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#import "ViewController.h"

@interface ViewController ()<UIWebViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

// 初始化
UIWebView *webView = [[UIWebView alloc]initWithFrame:self.view.bounds];
// 设置背景色
webView.backgroundColor = [UIColor redColor];

// 设置代理
webView.delegate = self;


// 添加到视图
[self.view addSubview:webView];

// 网址
NSString *path = @"http://www.baidu.com";
// 封装url,统一资源定位符,将字符串封装成可以识别的网址
NSURL *url = [NSURL URLWithString:path];
// 请求类
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 加载请求
[webView loadRequest:request];
}

#pragma mark - delegate
//即将加载
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
// YES:加载网页信息
// NO:不回网页信息
NSLog(@"即将加载");
return YES;
}
//已经开始加载
-(void)webViewDidStartLoad:(UIWebView *)webView{
NSLog(@"已经开始加载");
}
//加载成功
-(void)webViewDidFinishLoad:(UIWebView *)webView{
NSLog(@"加载成功");
}
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
NSLog(@"加载失败");
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
UITableView *_tableView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self createUITableView];
}
-(void)createUITableView{
// 初始化并设置样式和frame
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
// 设置背景色
_tableView.backgroundColor = [UIColor orangeColor];

// 设置代理
_tableView.dataSource = self;
_tableView.delegate = self;

[self.view addSubview:_tableView];

// 设置tableView的头视图
UIImageView *headerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];
headerImageView.image = [UIImage imageNamed:@"1.jpg"];
_tableView.tableHeaderView = headerImageView;
// 设置tableView的脚视图
UIImageView *footerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];
footerImageView.image = [UIImage imageNamed:@"2.jpg"];
_tableView.tableFooterView = footerImageView;
}
#pragma mark -
#pragma mark dataSource
//返回多少个分组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 2;
}
//返回每组有几行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (section == 0) {
return 10;
}
return 15;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

// 1.标识
static NSString *identifier = @"cellID";

// 2.从tableView复用池中取cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 3.如果从复用池中取不到cell,就创建新的
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}

cell.textLabel.text = [NSString stringWithFormat:@"第%ld组-第%ld行",indexPath.section,indexPath.row];

return cell;
}
#pragma mark -
#pragma mark delegate
////设置头标题
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section == 0) {
return @"第一组头标题";
}
return @"第二组头标题";
}
//设置头标题高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
// 默认22
return 40;
}
//设置分组脚标题
-(NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
if (section == 0) {
return @"第一组脚标题";
}
return @"第二组脚标题";
}
//设置脚标题的高度
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 40;
}
//返回自定义分组的头标和脚标,会把前面设置的标题覆盖
//必须设置头标题或头标题高度,否则本方法不生效
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, self.view.frame.size.width, 40);
[button setTitle:@"分组标题" forState:UIControlStateNormal];
button.backgroundColor = [UIColor purpleColor];
[button addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
return button;
}
-(void)onClick{
NSLog(@"点点点点点");
}
//必须设置脚标题或脚标题高度,否则本方法不生效
-(UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 40)];
imageView.image = [UIImage imageNamed:@"6.jpg"];
return imageView;
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#import "ViewController.h"

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
{
// 表格视图
UITableView *_tableView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self createUITableView];
// [_tableView performSelector:@selector(reloadData) withObject:nil afterDelay:5];
}
//创建UITableView
-(void)createUITableView{

// 初始化UITableView
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
// UITableViewStylePlain, 平铺样式
// UITableViewStyleGrouped 分组样式

// 背景色
_tableView.backgroundColor = [UIColor orangeColor];

// 设置数据源代理
_tableView.dataSource = self;
// 设置代理
_tableView.delegate = self;

[self.view addSubview:_tableView];
}
#pragma mark -
#pragma mark dataSource
//返回多少个分组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
NSLog(@"numberOfSectionsInTableView");
return 2;
}
//每组有多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSLog(@"numberOfRowsInSection");
if (section == 0) {
return 10;
}
return 20;

}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// NSLog(@"cellForRowAtIndexPath");
// indexPath
// 表示当cell在表格视图中的位置
// indexPath.section 代表的是cell所在的分组
// indexPath.row 代表的是cell所在分组的行的位置


// 1.表格的标识
static NSString *identifier = @"cellID";

// 2.按照标识从tableView复用池中取cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 3.如果在复用池中找不以Cell,就创建新的Cell
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
// UITableViewCellStyleDefault,
// UITableViewCellStyleValue1,
// UITableViewCellStyleValue2,
// UITableViewCellStyleSubtitle
}
// 设置展示标题
cell.textLabel.text = [NSString stringWithFormat:@"第%ld组",indexPath.section];
// 设置展示详细标题
cell.detailTextLabel.text = [NSString stringWithFormat:@"第%ld行",indexPath.row];
// 设置展示图片
cell.imageView.image = [UIImage imageNamed:@"1"];

// 附件按钮类型
cell.accessoryType = UITableViewCellAccessoryDetailButton;

// UITableViewCellAccessoryNone, 无样式
// UITableViewCellAccessoryDisclosureIndicator箭头
//UITableViewCellAccessoryDetailDisclosureButton 箭头+信息按钮
// UITableViewCellAccessoryCheckmark,对勾
// UITableViewCellAccessoryDetailButton 信息按钮

//=============================================
// UIView *accessView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
// accessView.backgroundColor = [UIColor blackColor];
//// 设置自定义的附件视图
// cell.accessoryView = accessView;
//=============================================


// 选中样式
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
// UITableViewCellSelectionStyleNone,
// UITableViewCellSelectionStyleBlue,
// UITableViewCellSelectionStyleGray,
// UITableViewCellSelectionStyleDefault

// 设置选中背景View
UIView *BackgroundView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
BackgroundView.backgroundColor = [UIColor clearColor];
cell.selectedBackgroundView = BackgroundView;

// UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
// imageView.image = [UIImage imageNamed:@"1"];
// cell.selectedBackgroundView = imageView;

return cell;
}

#pragma mark -
#pragma mark delegate
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
NSLog(@"点击了附件按钮");
}
//设置行高
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// 默认行高 44
return 80;
}
//设置分组的头标题
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section == 0) {
return @"第一组组标题";
}
return @"第二组组标题";
}
//设置脚标题
-(NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
if (section == 0) {
return @"第一组脚标";
}
return @"第二组脚标";
}
//组头的高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
// 默认高度是22
return 40;
}
//组尾的高度
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
// 默认高度是22
return 40;
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
UITableView *_tableView;
NSMutableArray *_dataArray;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self createUITableView];
[self createDataArray];

self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
//编辑按钮触发的方法
-(void)setEditing:(BOOL)editing animated:(BOOL)animated{
NSLog(@"%d",editing);
// 重新调用父类的方法,处于Done字样时,editing=YES,处于Edit样式时,editing = NO.
[super setEditing:editing animated:YES];

// 设置tableView的可编辑性
[_tableView setEditing:editing animated:YES];
}
-(void)createUITableView{
// 初始化UITableView 设置样式和frame
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
// 设置背景色
_tableView.backgroundColor = [UIColor orangeColor];
// 设置代理
_tableView.dataSource = self;
_tableView.delegate = self;
// 添加到视图
[self.view addSubview:_tableView];
}
-(void)createDataArray{

_dataArray = [NSMutableArray array];

// 数据源中要添加两组数据:删除的、增加的
NSMutableArray *deleteArray = [NSMutableArray array];
for (int i = 0 ; i < 10; i ++) {
NSString *deleteStr = [NSString stringWithFormat:@"被删除的第%d行",i];
[deleteArray addObject:deleteStr];
}
NSMutableArray *insertArray = [NSMutableArray array];
for (int i = 0 ; i < 10; i ++) {
NSString *insertStr = [NSString stringWithFormat:@"增加的第%d行",i];
[insertArray addObject:insertStr];
}

[_dataArray addObject:deleteArray];
[_dataArray addObject:insertArray];
NSLog(@"%@",_dataArray);
}
#pragma mark -
#pragma mark dataSource
//返回有多少组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return _dataArray.count;
}
//每组有多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

NSMutableArray *array = [_dataArray objectAtIndex:section];

return array.count;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// 1.定义标识
static NSString *identifier = @"cellID";
// 2.从tableView复用池中取cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 3.如果取不到cell,就创建新的cell
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}

// cell.textLabel.text = _dataArray[indexPath.section][indexPath.row];

// 赋值
cell.textLabel.text = [[_dataArray objectAtIndex:indexPath.section]objectAtIndex:indexPath.row];

return cell;
}
#pragma mark -
#pragma mark delegate
//选中了哪一行
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// NSLog(@"选中了哪一行");
NSLog(@"第%ld组-第%ld行",indexPath.section,indexPath.row);
}
//反选
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
// NSLog(@"didDeselectRowAtIndexPath");
NSLog(@"----第%ld组-第%ld行",indexPath.section,indexPath.row);
}
//设置tableView 的编辑状态
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

// UITableViewCellEditingStyleNone,无效果
// UITableViewCellEditingStyleDelete,删除
// UITableViewCellEditingStyleInsert 增加

if (indexPath.section == 0) {
return UITableViewCellEditingStyleDelete;
}else{
return UITableViewCellEditingStyleInsert;
}
}
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{

if (editingStyle == UITableViewCellEditingStyleDelete) {
// 删除当前对应行的数据源
[[_dataArray objectAtIndex:indexPath.section]removeObjectAtIndex:indexPath.row];

// [tableView reloadData];
// 刷新表
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}else{
NSString *insertStr = @"我是新来的";
// 数据源添加新数据
[[_dataArray objectAtIndex:indexPath.section] insertObject:insertStr atIndex:indexPath.row];
// 刷表
// [tableView reloadData];
[tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}
}
//是否允许某一行被编辑
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
// if (indexPath.row % 2 == 0) {
// return YES;
// }
// return NO;
return YES;
}
//移动要实现的方法
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
// sourceIndexPath 将要移动的cell的位置信息
// destinationIndexPath 目的位置信息

// 根据sourceIndexPath.section来获得第section组的数据
NSMutableArray *sourceArray = _dataArray[sourceIndexPath.section];
// 取出要移动cell所在行的数据
NSString *sourceStr = sourceArray[sourceIndexPath.row];
// 删除要移动cell所在行的数据
[sourceArray removeObjectAtIndex:sourceIndexPath.row];

// 根据destinationIndexPath.section来获取要插入的数组
NSMutableArray *destinationArray = _dataArray[destinationIndexPath.section];

[destinationArray insertObject:sourceStr atIndex:destinationIndexPath.row];
}
//能否移动
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section == 0) {
return NO;
}
return YES;
}
@end

UISwitch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// 初始化并设置frame
UIStepper *stepper = [[UIStepper alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
// 最小值
stepper.minimumValue = 0;

// 最大值
stepper.maximumValue = 10;
// 设置当前值
stepper.value = 4;
// 设置每次+2或-2,默认是1
stepper.stepValue = 2;

// 设置颜色
[stepper setTintColor:[UIColor orangeColor]];
// 添加事件
[stepper addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventValueChanged];

// 处理事件是否一直回调,默认是YES
stepper.continuous = YES;

// 设置能否重复操作,默认是YES
stepper.autorepeat = YES;

// 设置是否能循环,默认是NO
stepper.wraps = YES;

[self.view addSubview:stepper];
}
-(void)valueChange:(UIStepper*)stepper{
NSLog(@"%lf",stepper.value);
}
@end

UIView传统动画方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#import "RootViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad {
[super viewDidLoad];

// [self createUIView];

[self creatBlockAnimation];
}
#pragma mark -
#pragma mark UIView的Block动画
-(void)creatBlockAnimation{
UIView *myView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
myView.backgroundColor = [UIColor lightGrayColor];
myView.tag = 10;
[self.view addSubview:myView];

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(200, 50, 100, 100);
button.backgroundColor = [UIColor lightGrayColor];
[button setTitle:@"开始" forState:UIControlStateNormal];

[button addTarget:self action:@selector(blockAnimation) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
-(void)blockAnimation{
UIView *myView = [self.view viewWithTag:10];
// Duration:动画持续时间
// block:你想要的操作
// [UIView animateWithDuration:1 animations:^{
// myView.frame = CGRectMake(50, 200, 50, 50);
// }];


//Duration:动画持续时间
//animations:你想要的操作
//completion:动画结束后的操作
[UIView animateWithDuration:1 animations:^{
myView.frame = CGRectMake(50, 200, 50, 50);
} completion:^(BOOL finished) {
NSLog(@"动画结束");
}];







}
#pragma mark -
#pragma mark 传统的UIView动画
-(void)createUIView{
UIView *myView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
myView.backgroundColor = [UIColor yellowColor];
myView.tag = 10;
[self.view addSubview:myView];


UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(200, 50, 100, 100);
button.backgroundColor = [UIColor lightGrayColor];
[button setTitle:@"开始" forState:UIControlStateNormal];

[button addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
-(void)onClick{
UIView *myView = [self.view viewWithTag:10];

// 开始动画,第一个参数是动画名称,第二个传nil
[UIView beginAnimations:@"animation" context:nil];
// 设置动画代理
[UIView setAnimationDelegate:self];
// 设置动画延迟时间
[UIView setAnimationDelay:1];
// 设置动画持续时间
[UIView setAnimationDuration:2];

//设置动画的线性表现
/*
UIViewAnimationCurveEaseInOut 在开头和结尾都减速处理
UIViewAnimationCurveEaseIn 在开头做减速处理
UIViewAnimationCurveEaseOut 在结尾做减速处理
UIViewAnimationCurveLinear 这个应该是均分的处理
*/
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
// 设置动画的重复次数
[UIView setAnimationRepeatCount:2];

[UIView setAnimationRepeatAutoreverses:YES];
// 动画将要开始时调用的方法
[UIView setAnimationWillStartSelector:@selector(animationWillStart)];
// 动画已经结束时调用的方法
[UIView setAnimationDidStopSelector:@selector(animationDidStop)];

myView.frame = CGRectMake(50, 200, 100, 100);

// 提交动画
[UIView commitAnimations];
}
-(void)animationWillStart{
NSLog(@"动画将要开始");
}
-(void)animationDidStop{
NSLog(@"动画已经结束");
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
UITableView *_tableView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self createUITableView];
}
-(void)createUITableView{
// 初始化并设置样式和frame
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
// 设置背景色
_tableView.backgroundColor = [UIColor orangeColor];

// 设置代理
_tableView.dataSource = self;
_tableView.delegate = self;

[self.view addSubview:_tableView];

// 设置tableView的头视图
UIImageView *headerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];
headerImageView.image = [UIImage imageNamed:@"1.jpg"];
_tableView.tableHeaderView = headerImageView;
// 设置tableView的脚视图
UIImageView *footerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];
footerImageView.image = [UIImage imageNamed:@"2.jpg"];
_tableView.tableFooterView = footerImageView;
}
#pragma mark -
#pragma mark dataSource
//返回多少个分组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 2;
}
//返回每组有几行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (section == 0) {
return 10;
}
return 15;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

// 1.标识
static NSString *identifier = @"cellID";

// 2.从tableView复用池中取cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 3.如果从复用池中取不到cell,就创建新的
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}

cell.textLabel.text = [NSString stringWithFormat:@"第%ld组-第%ld行",indexPath.section,indexPath.row];

return cell;
}
#pragma mark -
#pragma mark delegate
////设置头标题
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section == 0) {
return @"第一组头标题";
}
return @"第二组头标题";
}
//设置头标题高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
// 默认22
return 40;
}
//设置分组脚标题
-(NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
if (section == 0) {
return @"第一组脚标题";
}
return @"第二组脚标题";
}
//设置脚标题的高度
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 40;
}
//返回自定义分组的头标和脚标,会把前面设置的标题覆盖
//必须设置头标题或头标题高度,否则本方法不生效
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, self.view.frame.size.width, 40);
[button setTitle:@"分组标题" forState:UIControlStateNormal];
button.backgroundColor = [UIColor purpleColor];
[button addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
return button;
}
-(void)onClick{
NSLog(@"点点点点点");
}
//必须设置脚标题或脚标题高度,否则本方法不生效
-(UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 40)];
imageView.image = [UIImage imageNamed:@"6.jpg"];
return imageView;
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#import "ViewController.h"

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
{
// 表格视图
UITableView *_tableView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self createUITableView];
// [_tableView performSelector:@selector(reloadData) withObject:nil afterDelay:5];
}
//创建UITableView
-(void)createUITableView{

// 初始化UITableView
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
// UITableViewStylePlain, 平铺样式
// UITableViewStyleGrouped 分组样式

// 背景色
_tableView.backgroundColor = [UIColor orangeColor];

// 设置数据源代理
_tableView.dataSource = self;
// 设置代理
_tableView.delegate = self;

[self.view addSubview:_tableView];
}
#pragma mark -
#pragma mark dataSource
//返回多少个分组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
NSLog(@"numberOfSectionsInTableView");
return 2;
}
//每组有多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSLog(@"numberOfRowsInSection");
if (section == 0) {
return 10;
}
return 20;

}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// NSLog(@"cellForRowAtIndexPath");
// indexPath
// 表示当cell在表格视图中的位置
// indexPath.section 代表的是cell所在的分组
// indexPath.row 代表的是cell所在分组的行的位置


// 1.表格的标识
static NSString *identifier = @"cellID";

// 2.按照标识从tableView复用池中取cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 3.如果在复用池中找不以Cell,就创建新的Cell
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
// UITableViewCellStyleDefault,
// UITableViewCellStyleValue1,
// UITableViewCellStyleValue2,
// UITableViewCellStyleSubtitle
}
// 设置展示标题
cell.textLabel.text = [NSString stringWithFormat:@"第%ld组",indexPath.section];
// 设置展示详细标题
cell.detailTextLabel.text = [NSString stringWithFormat:@"第%ld行",indexPath.row];
// 设置展示图片
cell.imageView.image = [UIImage imageNamed:@"1"];

// 附件按钮类型
cell.accessoryType = UITableViewCellAccessoryDetailButton;

// UITableViewCellAccessoryNone, 无样式
// UITableViewCellAccessoryDisclosureIndicator箭头
//UITableViewCellAccessoryDetailDisclosureButton 箭头+信息按钮
// UITableViewCellAccessoryCheckmark,对勾
// UITableViewCellAccessoryDetailButton 信息按钮

//=============================================
// UIView *accessView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
// accessView.backgroundColor = [UIColor blackColor];
//// 设置自定义的附件视图
// cell.accessoryView = accessView;
//=============================================


// 选中样式
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
// UITableViewCellSelectionStyleNone,
// UITableViewCellSelectionStyleBlue,
// UITableViewCellSelectionStyleGray,
// UITableViewCellSelectionStyleDefault

// 设置选中背景View
UIView *BackgroundView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
BackgroundView.backgroundColor = [UIColor clearColor];
cell.selectedBackgroundView = BackgroundView;

// UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
// imageView.image = [UIImage imageNamed:@"1"];
// cell.selectedBackgroundView = imageView;

return cell;
}

#pragma mark -
#pragma mark delegate
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
NSLog(@"点击了附件按钮");
}
//设置行高
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// 默认行高 44
return 80;
}
//设置分组的头标题
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section == 0) {
return @"第一组组标题";
}
return @"第二组组标题";
}
//设置脚标题
-(NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
if (section == 0) {
return @"第一组脚标";
}
return @"第二组脚标";
}
//组头的高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
// 默认高度是22
return 40;
}
//组尾的高度
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
// 默认高度是22
return 40;
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
UITableView *_tableView;
NSMutableArray *_dataArray;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self createUITableView];
[self createDataArray];

self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
//编辑按钮触发的方法
-(void)setEditing:(BOOL)editing animated:(BOOL)animated{
NSLog(@"%d",editing);
// 重新调用父类的方法,处于Done字样时,editing=YES,处于Edit样式时,editing = NO.
[super setEditing:editing animated:YES];

// 设置tableView的可编辑性
[_tableView setEditing:editing animated:YES];
}
-(void)createUITableView{
// 初始化UITableView 设置样式和frame
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
// 设置背景色
_tableView.backgroundColor = [UIColor orangeColor];
// 设置代理
_tableView.dataSource = self;
_tableView.delegate = self;
// 添加到视图
[self.view addSubview:_tableView];
}
-(void)createDataArray{

_dataArray = [NSMutableArray array];

// 数据源中要添加两组数据:删除的、增加的
NSMutableArray *deleteArray = [NSMutableArray array];
for (int i = 0 ; i < 10; i ++) {
NSString *deleteStr = [NSString stringWithFormat:@"被删除的第%d行",i];
[deleteArray addObject:deleteStr];
}
NSMutableArray *insertArray = [NSMutableArray array];
for (int i = 0 ; i < 10; i ++) {
NSString *insertStr = [NSString stringWithFormat:@"增加的第%d行",i];
[insertArray addObject:insertStr];
}

[_dataArray addObject:deleteArray];
[_dataArray addObject:insertArray];
NSLog(@"%@",_dataArray);
}
#pragma mark -
#pragma mark dataSource
//返回有多少组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return _dataArray.count;
}
//每组有多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

NSMutableArray *array = [_dataArray objectAtIndex:section];

return array.count;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// 1.定义标识
static NSString *identifier = @"cellID";
// 2.从tableView复用池中取cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 3.如果取不到cell,就创建新的cell
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}

// cell.textLabel.text = _dataArray[indexPath.section][indexPath.row];

// 赋值
cell.textLabel.text = [[_dataArray objectAtIndex:indexPath.section]objectAtIndex:indexPath.row];

return cell;
}
#pragma mark -
#pragma mark delegate
//选中了哪一行
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// NSLog(@"选中了哪一行");
NSLog(@"第%ld组-第%ld行",indexPath.section,indexPath.row);
}
//反选
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
// NSLog(@"didDeselectRowAtIndexPath");
NSLog(@"----第%ld组-第%ld行",indexPath.section,indexPath.row);
}
//设置tableView 的编辑状态
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

// UITableViewCellEditingStyleNone,无效果
// UITableViewCellEditingStyleDelete,删除
// UITableViewCellEditingStyleInsert 增加

if (indexPath.section == 0) {
return UITableViewCellEditingStyleDelete;
}else{
return UITableViewCellEditingStyleInsert;
}
}
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{

if (editingStyle == UITableViewCellEditingStyleDelete) {
// 删除当前对应行的数据源
[[_dataArray objectAtIndex:indexPath.section]removeObjectAtIndex:indexPath.row];

// [tableView reloadData];
// 刷新表
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}else{
NSString *insertStr = @"我是新来的";
// 数据源添加新数据
[[_dataArray objectAtIndex:indexPath.section] insertObject:insertStr atIndex:indexPath.row];
// 刷表
// [tableView reloadData];
[tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}
}
//是否允许某一行被编辑
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
// if (indexPath.row % 2 == 0) {
// return YES;
// }
// return NO;
return YES;
}
//移动要实现的方法
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
// sourceIndexPath 将要移动的cell的位置信息
// destinationIndexPath 目的位置信息

// 根据sourceIndexPath.section来获得第section组的数据
NSMutableArray *sourceArray = _dataArray[sourceIndexPath.section];
// 取出要移动cell所在行的数据
NSString *sourceStr = sourceArray[sourceIndexPath.row];
// 删除要移动cell所在行的数据
[sourceArray removeObjectAtIndex:sourceIndexPath.row];

// 根据destinationIndexPath.section来获取要插入的数组
NSMutableArray *destinationArray = _dataArray[destinationIndexPath.section];

[destinationArray insertObject:sourceStr atIndex:destinationIndexPath.row];
}
//能否移动
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section == 0) {
return NO;
}
return YES;
}
@end

UITableView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>//遵守协议
{
// 表格视图
UITableView *_tableView;


}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
[self createUITableView];
}
//创建UITableView
-(void)createUITableView{


// UITableViewStylePlain,
// UITableViewStyleGrouped
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];

// dataSource处理数据源相关
_tableView.dataSource = self;
// delegate处理移动、点击等
_tableView.delegate = self;

// 设置背景色
_tableView.backgroundColor = [UIColor orangeColor];

// 设置分隔线颜色
_tableView.separatorColor = [UIColor blueColor];

[self.view addSubview:_tableView];

}
#pragma mark -
#pragma mark dataSource delegate
//返回有多少个分组
//如果不实现该方法,就返回一组(默认是1)
//这个不是必须要实现的
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}

//每组有多少行
//必须实现
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 20;
}
//表格视图的信息
//必须实现
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

// 1.表格的标识
static NSString *identifier = @"cellID";
// 2.按照标识在tableView的复用池中查找Cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
/*
复用池的作用:
当UITableViewCell滑出屏幕时,不会被销毁,而是放到tableView的复用池中。
当新的Cell要出现在屏幕上时,先在复用池中查看有没有相同标识的Cell,如果有,就直接刷新数据使用。如果没有,就创建新的

假如一个界面上有多个UITableView,每个tableView有自己的复用池
*/
// 3.如果复用池中找不到Cell,就自己创建
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

static int a = 0;
NSLog(@"%d",a++);
}

// 给cell赋值
cell.textLabel.text = @"cell";

// 4.返回cell
return cell;
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
UITableView *_tableView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self createUITableView];
}
-(void)createUITableView{
// 初始化并设置样式和frame
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
// 设置背景色
_tableView.backgroundColor = [UIColor orangeColor];

// 设置代理
_tableView.dataSource = self;
_tableView.delegate = self;

[self.view addSubview:_tableView];

// 设置tableView的头视图
UIImageView *headerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];
headerImageView.image = [UIImage imageNamed:@"1.jpg"];
_tableView.tableHeaderView = headerImageView;
// 设置tableView的脚视图
UIImageView *footerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];
footerImageView.image = [UIImage imageNamed:@"2.jpg"];
_tableView.tableFooterView = footerImageView;
}
#pragma mark -
#pragma mark dataSource
//返回多少个分组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 2;
}
//返回每组有几行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (section == 0) {
return 10;
}
return 15;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

// 1.标识
static NSString *identifier = @"cellID";

// 2.从tableView复用池中取cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 3.如果从复用池中取不到cell,就创建新的
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}

cell.textLabel.text = [NSString stringWithFormat:@"第%ld组-第%ld行",indexPath.section,indexPath.row];

return cell;
}
#pragma mark -
#pragma mark delegate
////设置头标题
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section == 0) {
return @"第一组头标题";
}
return @"第二组头标题";
}
//设置头标题高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
// 默认22
return 40;
}
//设置分组脚标题
-(NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
if (section == 0) {
return @"第一组脚标题";
}
return @"第二组脚标题";
}
//设置脚标题的高度
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 40;
}
//返回自定义分组的头标和脚标,会把前面设置的标题覆盖
//必须设置头标题或头标题高度,否则本方法不生效
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, self.view.frame.size.width, 40);
[button setTitle:@"分组标题" forState:UIControlStateNormal];
button.backgroundColor = [UIColor purpleColor];
[button addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
return button;
}
-(void)onClick{
NSLog(@"点点点点点");
}
//必须设置脚标题或脚标题高度,否则本方法不生效
-(UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 40)];
imageView.image = [UIImage imageNamed:@"6.jpg"];
return imageView;
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#import "ViewController.h"

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
{
// 表格视图
UITableView *_tableView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self createUITableView];
// [_tableView performSelector:@selector(reloadData) withObject:nil afterDelay:5];
}
//创建UITableView
-(void)createUITableView{

// 初始化UITableView
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
// UITableViewStylePlain, 平铺样式
// UITableViewStyleGrouped 分组样式

// 背景色
_tableView.backgroundColor = [UIColor orangeColor];

// 设置数据源代理
_tableView.dataSource = self;
// 设置代理
_tableView.delegate = self;

[self.view addSubview:_tableView];
}
#pragma mark -
#pragma mark dataSource
//返回多少个分组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
NSLog(@"numberOfSectionsInTableView");
return 2;
}
//每组有多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSLog(@"numberOfRowsInSection");
if (section == 0) {
return 10;
}
return 20;

}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// NSLog(@"cellForRowAtIndexPath");
// indexPath
// 表示当cell在表格视图中的位置
// indexPath.section 代表的是cell所在的分组
// indexPath.row 代表的是cell所在分组的行的位置


// 1.表格的标识
static NSString *identifier = @"cellID";

// 2.按照标识从tableView复用池中取cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 3.如果在复用池中找不以Cell,就创建新的Cell
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
// UITableViewCellStyleDefault,
// UITableViewCellStyleValue1,
// UITableViewCellStyleValue2,
// UITableViewCellStyleSubtitle
}
// 设置展示标题
cell.textLabel.text = [NSString stringWithFormat:@"第%ld组",indexPath.section];
// 设置展示详细标题
cell.detailTextLabel.text = [NSString stringWithFormat:@"第%ld行",indexPath.row];
// 设置展示图片
cell.imageView.image = [UIImage imageNamed:@"1"];

// 附件按钮类型
cell.accessoryType = UITableViewCellAccessoryDetailButton;

// UITableViewCellAccessoryNone, 无样式
// UITableViewCellAccessoryDisclosureIndicator箭头
//UITableViewCellAccessoryDetailDisclosureButton 箭头+信息按钮
// UITableViewCellAccessoryCheckmark,对勾
// UITableViewCellAccessoryDetailButton 信息按钮

//=============================================
// UIView *accessView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
// accessView.backgroundColor = [UIColor blackColor];
//// 设置自定义的附件视图
// cell.accessoryView = accessView;
//=============================================


// 选中样式
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
// UITableViewCellSelectionStyleNone,
// UITableViewCellSelectionStyleBlue,
// UITableViewCellSelectionStyleGray,
// UITableViewCellSelectionStyleDefault

// 设置选中背景View
UIView *BackgroundView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
BackgroundView.backgroundColor = [UIColor clearColor];
cell.selectedBackgroundView = BackgroundView;

// UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
// imageView.image = [UIImage imageNamed:@"1"];
// cell.selectedBackgroundView = imageView;

return cell;
}

#pragma mark -
#pragma mark delegate
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
NSLog(@"点击了附件按钮");
}
//设置行高
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// 默认行高 44
return 80;
}
//设置分组的头标题
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section == 0) {
return @"第一组组标题";
}
return @"第二组组标题";
}
//设置脚标题
-(NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
if (section == 0) {
return @"第一组脚标";
}
return @"第二组脚标";
}
//组头的高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
// 默认高度是22
return 40;
}
//组尾的高度
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
// 默认高度是22
return 40;
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
UITableView *_tableView;
NSMutableArray *_dataArray;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self createUITableView];
[self createDataArray];

self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
//编辑按钮触发的方法
-(void)setEditing:(BOOL)editing animated:(BOOL)animated{
NSLog(@"%d",editing);
// 重新调用父类的方法,处于Done字样时,editing=YES,处于Edit样式时,editing = NO.
[super setEditing:editing animated:YES];

// 设置tableView的可编辑性
[_tableView setEditing:editing animated:YES];
}
-(void)createUITableView{
// 初始化UITableView 设置样式和frame
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
// 设置背景色
_tableView.backgroundColor = [UIColor orangeColor];
// 设置代理
_tableView.dataSource = self;
_tableView.delegate = self;
// 添加到视图
[self.view addSubview:_tableView];
}
-(void)createDataArray{

_dataArray = [NSMutableArray array];

// 数据源中要添加两组数据:删除的、增加的
NSMutableArray *deleteArray = [NSMutableArray array];
for (int i = 0 ; i < 10; i ++) {
NSString *deleteStr = [NSString stringWithFormat:@"被删除的第%d行",i];
[deleteArray addObject:deleteStr];
}
NSMutableArray *insertArray = [NSMutableArray array];
for (int i = 0 ; i < 10; i ++) {
NSString *insertStr = [NSString stringWithFormat:@"增加的第%d行",i];
[insertArray addObject:insertStr];
}

[_dataArray addObject:deleteArray];
[_dataArray addObject:insertArray];
NSLog(@"%@",_dataArray);
}
#pragma mark -
#pragma mark dataSource
//返回有多少组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return _dataArray.count;
}
//每组有多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

NSMutableArray *array = [_dataArray objectAtIndex:section];

return array.count;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// 1.定义标识
static NSString *identifier = @"cellID";
// 2.从tableView复用池中取cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 3.如果取不到cell,就创建新的cell
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}

// cell.textLabel.text = _dataArray[indexPath.section][indexPath.row];

// 赋值
cell.textLabel.text = [[_dataArray objectAtIndex:indexPath.section]objectAtIndex:indexPath.row];

return cell;
}
#pragma mark -
#pragma mark delegate
//选中了哪一行
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// NSLog(@"选中了哪一行");
NSLog(@"第%ld组-第%ld行",indexPath.section,indexPath.row);
}
//反选
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
// NSLog(@"didDeselectRowAtIndexPath");
NSLog(@"----第%ld组-第%ld行",indexPath.section,indexPath.row);
}
//设置tableView 的编辑状态
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

// UITableViewCellEditingStyleNone,无效果
// UITableViewCellEditingStyleDelete,删除
// UITableViewCellEditingStyleInsert 增加

if (indexPath.section == 0) {
return UITableViewCellEditingStyleDelete;
}else{
return UITableViewCellEditingStyleInsert;
}
}
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{

if (editingStyle == UITableViewCellEditingStyleDelete) {
// 删除当前对应行的数据源
[[_dataArray objectAtIndex:indexPath.section]removeObjectAtIndex:indexPath.row];

// [tableView reloadData];
// 刷新表
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}else{
NSString *insertStr = @"我是新来的";
// 数据源添加新数据
[[_dataArray objectAtIndex:indexPath.section] insertObject:insertStr atIndex:indexPath.row];
// 刷表
// [tableView reloadData];
[tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}
}
//是否允许某一行被编辑
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
// if (indexPath.row % 2 == 0) {
// return YES;
// }
// return NO;
return YES;
}
//移动要实现的方法
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
// sourceIndexPath 将要移动的cell的位置信息
// destinationIndexPath 目的位置信息

// 根据sourceIndexPath.section来获得第section组的数据
NSMutableArray *sourceArray = _dataArray[sourceIndexPath.section];
// 取出要移动cell所在行的数据
NSString *sourceStr = sourceArray[sourceIndexPath.row];
// 删除要移动cell所在行的数据
[sourceArray removeObjectAtIndex:sourceIndexPath.row];

// 根据destinationIndexPath.section来获取要插入的数组
NSMutableArray *destinationArray = _dataArray[destinationIndexPath.section];

[destinationArray insertObject:sourceStr atIndex:destinationIndexPath.row];
}
//能否移动
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section == 0) {
return NO;
}
return YES;
}
@end