簡體   English   中英

如何優化我的代碼以使用一種方法,而不是在不同類中使用同一方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM