相关知识点:
1.Bundle name
2.Bundle display name
try
三种处理异常的方式
@H_403_22@
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
do {
try NSJSONSerialization.JSONObjectWithData(jsonData,options: .MutableContainers)
}
catch {
print(error)
}
guard
let anyObject =
try? NSJSONSerialization.JSONObjectWithData(jsonData,options: .MutableContainers)
else {
return
}
try!NSJSONSerialization.JSONObjectWithData(jsonData,options: .MutableContainers)
封装TabBar创建自控制器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
addChildViewController(LXRHomeViewController(),title:
"首页",imageName:
"tabbar_home")
addChildViewController(LXRMessageViewController(),0);
Box-sizing: border-
Box;">"消息",0);
Box-sizing: border-
Box;">"tabbar_message_center")
addChildViewController(LXRDiscoverViewController(),0);
Box-sizing: border-
Box;">"发现",0);
Box-sizing: border-
Box;">"tabbar_discover")
addChildViewController(LXRProfileViewController(),0);
Box-sizing: border-
Box;">"我",0);
Box-sizing: border-
Box;">"tabbar_profile")
private func
addChildViewController(_ childVc: UIViewController,title : String,imageName : String) {
childVc.title = title
childVc.tabBarItem.image = UIImage(named: imageName)
childVc.tabBarItem.selectedImage = UIImage(named: imageName +
"_highlighted")
let childNav = UINavigationController(rootViewController: childVc)
addChildViewController(childNav)
}
根据Json文件,通过字符串获取数据
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
- 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
guard
let jsonPath = Bundle.main.path(forResource:
"MainVCSettings.json",ofType: nil)
else {
LXRLog(message:
"没有获取到对应的文件路径")
return
}
guard
let jsonData =
try? Data(contentsOf: URL(fileURLWithPath: jsonPath))
"没有获取到json文件中数据")
//3.将Data转成数组
guard
try? JSONSerialization.jsonObject(with: jsonData,options: .mutableContainers)
else {
return
}
guard
let dictArray = anyObject
as? [[String : AnyObject]]
else{
//4.遍历字典,获取对应的信息
for dict
in dictArray{
guard
let VcName = dict[
"vcName"]
as? String
continue
}
guard
let title = dict[
"title"]
//4.3获取控制器显示的图标名称
guard
let imageName = dict[
"imageName"]
continue
}
addChildViewController(VcName,title: title,imageName: imageName)
}
private func
addChildViewController(_ childVcName: String,imageName : String) {
guard
let nameSpace = (Bundle.main.infoDictionary![
"CFBundleExecutable"]
as? String)
else {
LXRLog(message:
"没有获取命名空间")
return
}
guard
let ChildVcClass = NSClassFromString(nameSpace +
"." + childVcName)
"没有获取到字符创对应的Class")
return
}
guard
let childVcType = ChildVcClass
as? UIViewController.Type
"没有获取对应控制器的类型")
return
}
let childVc = childVcType.init()
childVc.title = title
childVc.tabBarItem.image = UIImage(named: imageName)
childVc.tabBarItem.selectedImage = UIImage(named: imageName +
"_highlighted")
let childNav = UINavigationController(rootViewController: childVc)
addChildViewController(childNav)
}
代码创建Window
1
2
3
4
//
1.创建Window UIScreen
.main.bounds屏幕尺寸
window = UIWindow(frame: UIScreen
.bounds)
window?
.rootViewController = LXRMainTabBarController()
window?
.makeKeyAndVisible()
便利(convenience)构造函数
便利构造函数通常用在对系统的类进行构造函数的扩充时使用
便利(convenience)构造函数的特点:
1.便利构造函数通常都是写在 extension 里面
2.便利构造函数init前面加上 convenience
3.在便利构造函数中需要调用self.init()
Selector参数两种写法:
1.Selector(“方法名”)
2.”方法名”
3.swift3.0版本#selector(类名.方法名)
事件监听本质:
1.将方法包装成@SEL->类中查找方法列表->根据@SEL找到imp指针(函数指针)->执行函数
2.注意:swift中将一个函数声明成fileprivate,那么该函数不会被添加到方法列表中
3.如果在fileprivate前面加上@objc,那么该方法仍然会被添加到方法列表中
Swift限定作用域访问级别
在swift 3.0 之前,swift 提供3种不同的访问级别
1.public
(公开)
2.internal
(内部)–>系统默认
3.private
(私用)
swift 3.0private 将会被重新命名为 fileprivate
4.private
(私有)
1
2
3
4
5
6
7
8
9
10
/** * Duration: 持续时间 * delay: 延迟 * Damping: 阻力系数(0~1),越大效果越不明显 * Velocity: 速度 * options: 速度枚举 * animations: 动画 * completion: 完成 */
UIView.animate(withDuration: TimeInterval,delay: TimeInterval,usingSpringWithDamping: CGFloat,initialSpringVelocity: CGFloat,options: UIViewAnimationOptions,animations: () -> Void,completion: ((Bool) -> Void)?((Bool) -> Void)?(Bool) -> Void)
Swift中??
的作用
1.如果??
前面的可选类型有值
,那么将前面的可选类型进行解包并且赋值.
2.如果??
前面的可选类型为nil
,那么直接使用??后面的值.
1
let iconViewUrl = LXRAccountTool
.shareInstance.account?
.avatar_large ??
""
注意: 两个地方需要使用self
1>如果在一个函数中出现歧义.
2>在闭包中使用当前对象的属性和方法也需要使用self
动态设置tableViewCell高
必须实现的两个设置!!!
1.设置自动尺寸
2.设置估算高度
1
2
3
4
5
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight =
200
storyBoard快捷键
cmd+option(alt)+=
cmd+=
获取控件最大X.Y值
1
2
3
4
//
获取maxX->控件+frame+maxX
picCollectionView
.frame.maxX
//
获取maxY->控件+frame+maxY
picCollectionView
.maxY
3.打印信息