Ios 如何优化代码,使其在不同的类中使用一个方法而不是多个相同的方法?
我在不同的视图控制器类中有相同的方法,这基本上为视图控制器添加了模糊效果。现在我试图使用其他swift类型来简化我的代码,但我不知道如何实现这一点,以便添加子视图可以正常工作。处理此类案例的好方法是什么?扩展、协议、结构、类还是其他函数 这是一个视图控制器(此处简化):Ios 如何优化代码,使其在不同的类中使用一个方法而不是多个相同的方法?,ios,objective-c,swift,optimization,Ios,Objective C,Swift,Optimization,我在不同的视图控制器类中有相同的方法,这基本上为视图控制器添加了模糊效果。现在我试图使用其他swift类型来简化我的代码,但我不知道如何实现这一点,以便添加子视图可以正常工作。处理此类案例的好方法是什么?扩展、协议、结构、类还是其他函数 这是一个视图控制器(此处简化): 我有其他类似的视图控制器。如何将它们重构为在整个项目中只使用一次addBlurEffect() 您可以使用子类化 创建一个属于UIViewController的子类的类,如下所示: class CustomViewControl
我有其他类似的视图控制器。如何将它们重构为在整个项目中只使用一次addBlurEffect() 您可以使用子类化 创建一个属于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
}
}
然后,您可以将此类用于所有视图控制器,并访问addBlurrEffect
函数,如下所示:
class ViewControllerOne: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
addBlurrEffect()
}
}
class ViewControllerTwo: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
addBlurrEffect()
}
}
您可以使用子类化 创建一个属于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
}
}
然后,您可以将此类用于所有视图控制器,并访问addBlurrEffect
函数,如下所示:
class ViewControllerOne: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
addBlurrEffect()
}
}
class ViewControllerTwo: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
addBlurrEffect()
}
}
在项目中为blur函数创建NSObject类,并在其中添加方法 要调用该方法,首先在VC中创建该模型类的对象,并像下面这样使用obj.addBlur() 注意:如果您需要vc中的任何变量,请将该变量作为addBlur函数的参数发送
示例:addBlur(self.Viewblur)在项目中为blur函数创建NSObject类,并在其中添加方法 要调用该方法,首先在VC中创建该模型类的对象,并像下面这样使用obj.addBlur() 注意:如果您需要vc中的任何变量,请将该变量作为addBlur函数的参数发送
示例:addBlur(self.Viewblur)在协议中声明此行为:
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)
}
}
定义该协议扩展中的行为:
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?
// ...
}
在协议中声明此行为:
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)
}
}
定义该协议扩展中的行为:
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?
// ...
}
像这样的东西会有用的。您也可以使用@IBenspectable
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 ....
}
}
像这样的东西会有用的。您也可以使用@IBenspectable
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 ....
}
}
您应该创建并向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
}
}
但是请注意,您不能在扩展中添加实例变量。您可能应该重构函数以返回生成的模糊效果视图,而不是依赖实例变量。您应该创建一个扩展来添加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
}
}
但是请注意,您不能在扩展中添加实例变量。您可能应该重构函数以返回结果模糊效果视图,而不是依赖实例变量。您可以创建第二个类似这样的类
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 ....
}
你可以做这样的二等舱
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 ....
}
你试过分机吗?检查这个:@DharmeshKheni这是一个好主意,我想我必须把我的问题写得更笼统一点,因为我并不仅仅是在寻找这个案例的答案。这是一种更为普遍的方法,但非常感谢这一点,这有助于我们的欢迎:)@TheeBen为什么
UIVisualEffectView
很弱?@TheeBen没有MyClass
拥有blurEffectView
的所有权关系?您尝试过扩展吗?检查这个:@DharmeshKheni这是一个好主意,我想我必须把我的问题写得更笼统一点,因为我并不仅仅是在寻找这个案例的答案。这是一种更为普遍的方法,但非常感谢这一点,这有助于我们的欢迎:)@TheeBen为什么UIVisualEffectView
弱?@TheeBen没有MyClass
拥有blurEffectView
的所有权关系?仅仅需要一个子类来获得这一方法是非常有限的。协议或扩展更合适。@Alexander,你说的限制是什么意思?如果你不介意扩大一点,那么限制是多少,谢谢lot@TheeBen如果我想将SomeOtherViewController子类化,但仍然使用模糊效果怎么办?让SomeOtherViewController
成为CustomViewController
@KennyGunderman的子类,你是对的,这会回答问题,但我认为这是我的错,我在寻找一种,对于一个一般性问题的更一般的答案,我试图将这个问题编辑成更一般的问题,需要一个子类来获得这个方法是非常有限的。协议或扩展更合适。@Alexander,你说的限制是什么意思?如果你不介意扩大一点,那么限制是多少,谢谢lot@TheeBen如果我想将SomeOtherViewController子类化,但仍然使用模糊效果怎么办?让SomeOtherViewController
成为CustomViewController
@KennyGunderman的子类,你是对的,这会回答问题,但我认为这是我的错,我在寻找一个更一般的问题的答案,我试图将这个问题编辑成更一般的问题,但是在addSubView()方面我会有困难吗然后?检查我现在添加的答案。考虑到扩展扩展扩展到所有UIViewController,编写协议只是需要添加更多代码,而不是简化,我发现这是做这件事的最简单的方法。但是当涉及addSubView()时,我会有困难吗然后?检查我现在添加的答案。考虑到扩展扩展扩展到所有UIViewController,编写协议只是需要添加更多代码,而不是简化。你不能像这样在UIView扩展中添加存储属性抱歉,我的代码有点不完整。您需要创建setter和getter。很好的调用@Alexander您不能像这样在UIView的扩展中添加存储属性抱歉,我的代码有点不完整。