编写通用代码并在整个项目中使用它的最佳方法是什么

时间:2019-07-01 11:45:16

标签: ios swift cocoa-touch design-patterns singleton

我从Shared类中调用警报,视图的颜色,微调器和组件属性等。这是正确的方法。如果不是,编写通用代码并在整个项目中使用它的最佳方法是什么。

例如:我共享的班级代码是...

import UIKit

class SharedClass: NSObject {

static let sharedInstance = SharedClass()

    var spinner = UIActivityIndicatorView()

//Show activity indicator
func activityIndicator() {

    DispatchQueue.main.async {
        if let window = UIApplication.shared.keyWindow {//Conditionally unwrap it instead of force unwrap

  //                let window = UIApplication.shared.keyWindow! //Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
            self.transparentView = UIView()
            self.transparentView?.frame = CGRect(x: 0, y: 0, width: window.frame.width, height: window.frame.height)
            self.transparentView?.backgroundColor = UIColor.black.withAlphaComponent(0.4)
            window.addSubview(self.transparentView!)

            if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
                //                    self.spinner = UIActivityIndicatorView(style: .whiteLarge)
                self.spinner = UIActivityIndicatorView(style: .whiteLarge)
                self.spinner.frame = CGRect(x: 0, y: 0, width: 60, height: 60)
            } else {
                //                    self.spinner = UIActivityIndicatorView(style: .white)
                self.spinner = UIActivityIndicatorView(style: .white)
                self.spinner.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
            }
            self.spinner.center = window.center
            self.transparentView?.addSubview(self.spinner)
            self.spinner.startAnimating()

            DispatchQueue.main.asyncAfter(deadline: .now() + 40.0) {//Stop spinner after 40 Sec's
                self.stopActivityIndicator()
            }
        }
    }
}

//Stop activity indicator
func stopActivityIndicator() {
    DispatchQueue.main.async {
        self.spinner.stopAnimating()
        self.spinner.removeFromSuperview()
        self.transparentView?.removeFromSuperview()//Some times getting error here
    }
}

 //Email validation
func isValidEmail(email: String) -> Bool {
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
    var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
    if valid {
        valid = !email.contains("Invalid email id")
    }
    return valid
}

//Mobile number validation
func isValidPhone(phone: String) -> Bool {
    let phoneRegex = "^((0091)|(\\+91)|0?)[6789]{1}\\d{9}$"; // @"^((0091)|(\\+91)|0?)[6789]{1}\\d{9}$"        "^[0-9]{6,14}$"
    let valid = NSPredicate(format: "SELF MATCHES %@", phoneRegex).evaluate(with: phone)
    return valid
}

 private override init() {

}

}

//Alert function
extension UIViewController {
    func showAlert(title: String, msg: String) {
        DispatchQueue.main.async {
            let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }
}

//Set TF shadow in login VC
extension UITextField {
    func TFProperties() {
        layer.shadowColor = UIColor(red: 199/255, green: 217/255, blue: 223/255, alpha: 1.0).cgColor
        layer.shadowOpacity = 1
        layer.shadowOffset = CGSize.zero
        layer.shadowRadius = 5
        layer.borderColor = UIColor(red: 199/255, green: 217/255, blue: 223/255, alpha: 1.0).cgColor
        layer.borderWidth = 1
        layer.cornerRadius = 4
    }
}

//Set View shadow in OTPVerify VC
extension UIView {
func subViewShadow() {
    layer.shadowColor = UIColor.white.cgColor
    layer.shadowOpacity = 1
    layer.shadowOffset = CGSize.zero
    layer.shadowRadius = 3
    layer.borderColor = UIColor.gray.cgColor
    layer.borderWidth = 1
    layer.cornerRadius = 4
}
func viewShadow() {
    layer.shadowColor = UIColor.gray.cgColor
    layer.shadowOpacity = 1
    layer.shadowOffset = CGSize.zero
    layer.shadowRadius = 3
}
func collectionViewCellBorder() {
    layer.cornerRadius = 5
    layer.borderColor = UIColor UIColor.gray.cgColor
    layer.borderWidth = 1.0
}
}

3 个答案:

答案 0 :(得分:5)

创建一个通用框架:

  • XCode> File> New> Project>

Project Selection

  • 可可触摸框架>

Cocoa Touch Framework

  • 设置框架名称(通用等)>

Common Framework

  • 在“添加到”和“组”部分中选择主要的工作区,然后创建>

Create Framework

  • 您应该将框架链接到主要目标链接库>

Link Binary with Libraries

  • 您可以在您的框架中创建类>

Colors in framework

  • 并使用主项目,只需导入“ import Common”之类的框架即可。

Usage

注意:您应该在通用框架(私有,公共,开放等)上使用访问级别修饰符。

访问级别修饰符:

来源: Abhimuralidharan's Swift 4— Access Control Article

  1. 公开:  允许在定义模块(目标)之外使用实体。

  2. 私人:  私有访问将实体的使用限制为封闭的声明以及同一文件中该声明的扩展。

答案 1 :(得分:1)

您正在做的事情是正确的,它是一个单例模式。对于像alertViewController,选择器控件(如login-logout等)这样的管理器来说,这是一个很好的选择。可以调用它并使用几种不同的观点。它还减少了代码重复。例如,您需要对两个不同的视图控制器使用操作表。此时,您可以使用单例模式,并从此共享实例的方法之外提供一些参数,并从一点开始对其进行特定操作调用。您无需在每个控制器中都创建两个不同的警报控制器:)。明智地使用它:)。

答案 2 :(得分:1)

如果您还可以使用this.router.params.subscribe(params => { console.log(params['id']); //it gives undefined. }); @IBDesignable进行与视图相关的工作,例如添加阴影,角半径等,以便您也可以从情节提要中更改它,则这是一种正确的方法。 喜欢。

@IBInspectable
相关问题