iOS App架构上的一些具体设计

iOS App架构上的一些具体设计

非大神,只作个人记录用,大家将就着看看,欢迎指正和讨论。

忽略代码的组织形式,忽略构建工具例如:maven,cocoapods,gradle之类的东西,我觉得这些只是我们将代码集成起来构建工程的一个工具,或者换句话说是你打算把代码放哪儿,怎么放;这些内容先不在这个里面做讨论

大方向上用继承,小方向上用扩展

多年前一位老大的经验之谈吧,想想是很有道理的。先我们拉个文件夹叫Core,里面放上类似以下文件结构目录:

1
2
3
4
5
6
├── Base
│   └── BaseExtension
├── Extension
├── Log
├── Net
└── Util

大方向上用继承

Base里是一些类似对UIKit之类的继承,比如BaseViewController在这里面我们可以把一些常用的接口进行声明or定义。

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
import Foundation
import UIKit
class BaseViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.addNotifiaction()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.removeNotifiaction()
}
override func viewDidLoad() {
super.viewDidLoad()
self.initData()
self.configUI()
}
func setNavigationBarTitle(_ title: String, titleColor: UIColor, titleFont: UIFont = UIFont.systemFont(ofSize: 17)) -> Void {
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 40, height: 30))
label.text = title
label.font = titleFont
label.textColor = titleColor
self.navigationItem.titleView = label
}
/// 隐藏NavigationBar底部的阴影线
func hideNavigationBarShadowLine() -> Void {
let image = UIImage.createImageWithColor(color: UIColor.clear)
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
//消除阴影
self.navigationController?.navigationBar.shadowImage = image
}
/**
设置导航栏的颜色
- parameter color: 颜色
*/
func setNavigationBarColor(_ color: UIColor) {
self.navigationController?.navigationBar.backgroundColor = color
self.navigationController?.navigationBar.barTintColor = color
}
/**
添加返回上级viewcontroller的按键
*/
func addBackItemBtn() {
let leftBarItem = UIBarButtonItem(image: UIImage(named: "ico_back"), style: .plain, target: self, action: #selector(onClickBackItem))
self.navigationItem.leftBarButtonItem = leftBarItem
self.navigationItem.leftBarButtonItem?.tintColor = TextBlackColor//UIColor.gray
}
func onClickBackItem(sender: AnyObject) -> Void {
}
// 初始化数据
func initData() -> Void {
}
// 配置ui
func configUI() -> Void {
self.view.backgroundColor = WhiteColor
configNavigationBar()
}
// 初始化NavigationBar
func configNavigationBar() -> Void {
}
// 关闭viewcontroller界面
func close() -> Void {
}
// 增加Notifiaction监听
func addNotifiaction() -> Void {
}
// 移除Notifiaction监听
func removeNotifiaction() -> Void {
}
}

有人会说这些个空方法没啥意义,确实没啥太大的意义。它们只是改变以后你自己的代码讲一些UI写在哪里,将通知事件写在哪里;好比这个地方,我们的通知事件就已经包装在addNotifiaction和removeNotifiaction两个方法里了,包括正常情况下是在viewcontroller的viewWillAppear方法里去增加事件监听,在viewWillDisappear方法里去移除监听。

再比如configUI以后我就只需要将所有的ViewController继承BaseViewController,那么所有的UI初始化的东西都可以丢到configUI这个方法里去做,以后哪部分代码有问题都容易查找,并不会显得杂乱。

小方向上用扩展

再看另一个地方Base下有个BaseExtension文件夹,这个是干嘛的咧,所谓的小方向用扩展嘛,extension关键字是很有用的,会让你的代码更加的简洁而又不需要继承这么厚重。这里面就是一个简单的应用场景,我们在开发App的时候总有一些提示tips想展示给客户,这种tips一般有通知的形式的,我们可以稍作封装一下就不用每次都去写tips的字体,显示时间等一些代码了。懒,很重要~!

1
2
3
4
5
6
7
8
9
10
11
import Foundation
import Toast_Swift
extension BaseViewController {
func showToast(msg: String, completion: ((_ didTap: Bool) -> Void)?) -> Void {
var style = ToastStyle()
style.cornerRadius = AppCornerRadius
style.messageFont = UIFont.regularFont(size: 15)
self.view.makeToast(msg, duration: 1.3, position: .center, title: nil, image: nil, style: style, completion: completion)
}
}

这样子,在一个ViewController里需要展示通用的tips的时候只需要一句话

1
2
3
self.showToast(msg: msg, completion: { (didTap: Bool) in
self.close()
})

OK~这样子project代码的整洁度包括可读性都会有一个不错的提升,当然有童鞋会喷,你的ViewController里怎么啥都有耦合严重,额,确实需要改改,but先看这些部分吧~~相信这部分总有一些简单而实际的启发。先这样子吧 O(∩_∩)O哈哈~