如何优化我的代码以在不同的类中使用一种方法而不是多种方法?

时间:2017-02-08 17:55:45

标签: ios objective-c swift optimization

我在不同的视图控制器类中有相同的方法,基本上它为视图控制器添加了模糊效果。现在我正在尝试使用其他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()一次?

6 个答案:

答案 0 :(得分:2)

在项目中为blur函数创建NSObject类,并在那里添加方法。

要调用方法,首先在VC中创建该模型类的对象,然后像这样使用obj.addBlur()。

注意:如果你需要来自vc的任何变量,那么将该变量作为addBlur函数的参数发送。

示例:addBlur(self.Viewblur)

答案 1 :(得分:1)

您可以使用子类化

创建一个类,它是 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控制器并访问addBlurrEffect函数,如下所示:

class ViewControllerOne: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        addBlurrEffect()

    }
}

class ViewControllerTwo: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        addBlurrEffect()

    }
} 

答案 2 :(得分:1)

在协议中声明此行为:

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)
    }
}

并将此协议的一致性添加到所有相关的ViewControllers:

class MyVC1: UIViewController, Blurrable {
    weak var blurEffectView : UIVisualEffectView?

    // ...
}

class MyVC2: UIViewController, Blurrable {
    weak var blurEffectView : UIVisualEffectView?

    // ...
}

答案 3 :(得分:1)

您应该创建为UIViewController添加扩展名:

__len__

请注意,您无法在扩展中添加实例变量。您应该重构函数以返回生成的模糊效果视图,而不是依赖于实例变量。

答案 4 :(得分:0)

这样的东西会起作用。您也可以使用@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 .... 
  } 
}

答案 5 :(得分:0)

你可以像这样做第二节课

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 .... 
}