[英]How can I optimize my code to use one method instead of multiple of same in different classes?
我在不同的視圖控制器類中具有相同的方法,基本上,這會為視圖控制器添加模糊效果。 現在,我試圖使用其他swift類型來簡化代碼,但是對於如何實現此方法感到困惑,以便添加子視圖正常工作。 有什么好的方法可以處理這種情況? 擴展,協議,結構,類或其他功能?
這是一個視圖控制器(在此簡化):
import UIKit
class MyClass: UIViewController {
weak var blurEffectView : UIVisualEffectView?
.... other methods ....
func addBlurrEffect() {
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectVw = UIVisualEffectView(effect: blurEffect)
blurEffectVw.frame = self.view.bounds
blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
self.view.addSubview(blurEffectVw)
blurEffectView = blurEffectVw
}
... other methods ....
}
我有其他類似的視圖控制器。 我如何重構它們以在整個項目中僅使用一次addBlurEffect()?
在項目中為blur函數創建NSObject類,然后在此處添加方法。
要調用method,首先在VC中創建該模型類的對象,然后使用obj.addBlur()這樣的對象。
注意:如果需要vc中的任何變量,則將該變量作為addBlur函數的參數發送。
示例:addBlur(self.Viewblur)
您可以使用子類化 。
創建一個類,它是UIViewController的子類,如下所示:
class CustomViewController: UIViewController {
weak var blurEffectView : UIVisualEffectView?
func addBlurrEffect() {
//layout for the pool of clnts that can be selected to add files
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectVw = UIVisualEffectView(effect: blurEffect)
blurEffectVw.frame = self.view.bounds
blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
self.view.addSubview(blurEffectVw)
blurEffectView = blurEffectVw
}
}
然后,您可以將此類用於所有View Controller,並按如下方式訪問addBlurrEffect
函數:
class ViewControllerOne: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
addBlurrEffect()
}
}
class ViewControllerTwo: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
addBlurrEffect()
}
}
在協議中聲明此行為:
protocol Blurrable {
var view: UIView { get set }
var blurEffectView: UIVisualEffectView? { get set }
func addBlurrEffect()
}
在該協議的擴展中定義行為:
extension Blurrable {
func addBlurrEffect()
//layout for the pool of clnts that can be selected to add files
let blurEffect = UIBlurEffect(style: .dark)
blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = self.view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
self.view.addSubview(blurEffectView)
}
}
並將此協議的一致性添加到所有相關的ViewController:
class MyVC1: UIViewController, Blurrable {
weak var blurEffectView : UIVisualEffectView?
// ...
}
class MyVC2: UIViewController, Blurrable {
weak var blurEffectView : UIVisualEffectView?
// ...
}
您應該創建一個添加擴展到UIViewController:
extension UIViewController {
func addBlurrEffect() {
//layout for the pool of clnts that can be selected to add files
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectVw = UIVisualEffectView(effect: blurEffect)
blurEffectVw.frame = self.view.bounds
blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
self.view.addSubview(blurEffectVw)
blurEffectView = blurEffectVw
}
}
請注意,您不能在擴展中添加實例變量。 您可能應該重構函數以返回生成的模糊效果視圖,而不是依賴實例變量。
這樣的事情會起作用。 您也可以使用@IBInspectable。
import UIKit
extension UIView {
weak var blurEffectView : UIVisualEffectView?
.... other methods ....
func addBlurrEffect() {
//layout for the pool of clnts that can be selected to add files
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectVw = UIVisualEffectView(effect: blurEffect)
blurEffectVw.frame = self.view.bounds
blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
self.view.addSubview(blurEffectVw)
blurEffectView = blurEffectVw
}
... other methods ....
}
}
你可以像這樣上第二堂課
class BlurManager {
weak var blurEffectView: UIVisualEffectView?
weak var viewController: UIViewController
var isBlurred:Bool = false
init(viewController:UIViewController){
self.viewController = viewController
}
func addBlurEffect() {
if !isBlurred {
isBlurred = true
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectVw = UIVisualEffectView(effect: blurEffect)
blurEffectVw.frame = self.view.bounds
blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
viewController.view.addSubview(blurEffectVw)
blurEffectView = blurEffectVw
}
}
func removeBlurEffect() {
if isBlurred {
isBlurred = false
...cleanup...
}
}
}
class MyClass: UIViewController {
lazy var blurManager: BlurManager = {
return BlurManager(viewController:self)
}()
.... other methods ....
blueManager.addBlurEffect()
... other methods ....
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.