swift使用协议protocols 进行复合扩展
ViewController 增加等待指示器(菊花)
原代码
-
import UIKit
-
-
class BaseViewController: UIViewController {
-
private let activityIndicator = UIActivityIndicatorView(style: .whiteLarge)
-
-
override func viewDidLoad() {
-
super.viewDidLoad()
-
view.addSubview(activityIndicator)
-
-
activityIndicator.translatesAutoresizingMaskIntoConstraints = false
-
NSLayoutConstraint.activate([
-
activityIndicator.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
-
activityIndicator.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor)
-
])
-
}
-
-
func presenActivity() {
-
activityIndicator.startAnimating()
-
}
-
-
func dismissActivity() {
-
activityIndicator.stopAnimating()
-
}
-
-
func present(_ error: Error) {
-
let alert = UIAlertController(title: error.localizedDescription, message: nil, preferredStyle: .alert)
-
alert.addAction(.init(title: "Cancel", style: .cancel))
-
present(alert, animated: true)
-
}
-
}
使用 protocol 拆
-
protocol ActivityPresentable {
-
func presentActivity()
-
func dismissActivity()
-
}
-
-
extension ActivityPresentable where Self: UIViewController {
-
func presentActivity() {
-
if let activityIndicator = findActivity() {
-
activityIndicator.startAnimating()
-
} else {
-
let activityIndicator = UIActivityIndicatorView(style: .whiteLarge)
-
activityIndicator.startAnimating()
-
view.addSubview(activityIndicator)
-
-
activityIndicator.translatesAutoresizingMaskIntoConstraints = false
-
NSLayoutConstraint.activate([
-
activityIndicator.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
-
activityIndicator.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor)
-
])
-
}
-
}
-
-
func dismissActivity() {
-
findActivity()?.stopAnimating()
-
}
-
-
func findActivity() -> UIActivityIndicatorView? {
-
return view.subviews.compactMap { $0 as? UIActivityIndicatorView }.first
-
}
-
}
再来一个扩展
-
protocol ErrorPresentable {
-
func present(_ error: Error)
-
}
-
-
extension ErrorPresentable where Self: UIViewController {
-
func present(_ error: Error) {
-
let alert = UIAlertController(title: error.localizedDescription, message: nil, preferredStyle: .alert)
-
alert.addAction(.init(title: "Cancel", style: .cancel))
-
present(alert, animated: true)
-
}
-
}
使用
-
class ViewController: UIViewController {
-
override func viewDidLoad() {
-
super.viewDidLoad()
-
presentActivity()
-
}
-
}
-
-
extension ViewController: ActivityPresentable, ErrorPresentable {}
这种方法有另外一个好处,在某些的controller里,我们可以实现自定义的ActivityIndicator
-
class CustomViewController: UIViewController {
-
override func viewDidLoad() {
-
super.viewDidLoad()
-
presentActivity()
-
}
-
}
-
-
extension CustomViewController: ActivityPresentable {
-
func presentActivity() {
-
// Custom activity presenting logic
-
}
-
-
func dismissActivity() {
-
-
}
-
}
参考
https://swiftwithmajid.com/2019/01/17/using-protocols-as-composable-extensions/
官方视频:
Protocol-Oriented Programming in Swift - WWDC15 - Videos - Apple Developer
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhibcfhf
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22