您可以为如下创建通用类:
class Utils {
//MARK:- STRING FROM DICT
func getStringFromDictionary(dict:Any) -> String{
var strJson = ""
do {
let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions.prettyPrinted)
strJson = String(data: data, encoding: String.Encoding.utf8)!
} catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
return strJson
}
//MARK:- ALERT
func showAlertWithTitleFromVC(vc:UIViewController, title:String, andMessage message:String, buttons:[String], completion:((_ index:Int) -> Void)!) -> Void {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
for index in 0..<buttons.count {
// alertController.setValue(NSAttributedString(string: title, attributes: [NSFontAttributeName : UIFont.appFont_OpenSans_Regular(fontSize: 15),NSForegroundColorAttributeName : BLACK_COLOR]), forKey: "attributedTitle")
//
// alertController.setValue(NSAttributedString(string: message, attributes: [NSFontAttributeName : UIFont.appFont_OpenSans_Regular(fontSize: 13),NSForegroundColorAttributeName : APP_COLOR_BLUE_1]), forKey: "attributedMessage")
let action = UIAlertAction(title: buttons[index], style: .default, handler: {
(alert: UIAlertAction!) in
if(completion != nil){
completion(index)
}
})
// action.setValue(APP_COLOR_BLUE_2, forKey: "titleTextColor")
alertController.addAction(action)
}
vc.present(alertController, animated: true, completion: nil)
}
//MARK:- ACTION SHEET
func showActionSheetWithTitleFromVC(vc:UIViewController, title:String, andMessage message:String, buttons:[String],canCancel:Bool, completion:((_ index:Int) -> Void)!) -> Void {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .actionSheet)
alertController.setValue(NSAttributedString(string: title, attributes: [NSFontAttributeName : UIFont.appFont_OpenSans_Regular(fontSize: 15),NSForegroundColorAttributeName : BLACK_COLOR]), forKey: "attributedTitle")
alertController.setValue(NSAttributedString(string: message, attributes: [NSFontAttributeName : UIFont.appFont_OpenSans_Regular(fontSize: 13),NSForegroundColorAttributeName : APP_COLOR_BLUE_1]), forKey: "attributedMessage")
for index in 0..<buttons.count {
let action = UIAlertAction(title: buttons[index], style: .default, handler: {
(alert: UIAlertAction!) in
if(completion != nil){
completion(index)
}
})
action.setValue(APP_COLOR_BLUE_2, forKey: "titleTextColor")
alertController.addAction(action)
}
if(canCancel){
let action = UIAlertAction(title: "Cancel", style: .cancel, handler: {
(alert: UIAlertAction!) in
if(completion != nil){
completion(buttons.count)
}
})
action.setValue(APP_COLOR_BLUE_2, forKey: "titleTextColor")
alertController.addAction(action)
}
vc.present(alertController, animated: true, completion: nil)
}
//MARK:- INTERNET CHECK
func IS_INTERNET_AVAILABLE() -> Bool{
return AIReachabilityManager.shared.isInternetAvailableForAllNetworks()
}
let INTERNET_MESSAGE:String = "Oops! It seems that you're not connected to the Internet, connect and try again"//"No internet connection, Please try later"
func SHOW_INTERNET_ALERT(){
showAlertWithTitleFromVC(vc: (appDelegate.window?.rootViewController)!, title: APP_NAME, andMessage: INTERNET_MESSAGE, buttons: ["Dismiss"]) { (index) in
}
}
//MARK:- CUSTOM LOADER
func SHOW_CUSTOM_LOADER(){
SHOW_CUSTOM_LOADER_WITH_TEXT(text: "")
}
func SHOW_CUSTOM_LOADER_WITH_TEXT(text:String){
SVProgressHUD.setDefaultStyle(.custom)
SVProgressHUD.setDefaultMaskType(.custom)
SVProgressHUD.setDefaultAnimationType(.flat)
SVProgressHUD.setBackgroundColor(UIColor.clear)
SVProgressHUD.setRingRadius(30)
SVProgressHUD.setRingThickness(5)
SVProgressHUD.setForegroundColor(WHITE_COLOR)
if(text.characters.count > 0){
SVProgressHUD.show(withStatus: text)
}else{
SVProgressHUD.show()
}
}
func HIDE_CUSTOM_LOADER(){
SVProgressHUD.dismiss()
}
//MARK:- USER DEFAULTS
func setUserDefaultsFor(object:AnyObject, with key:String) {
UserDefaults.standard.set(object, forKey: key)
UserDefaults.standard.synchronize()
}
func getUserDefaultsForKey(key:String) -> AnyObject? {
return UserDefaults.standard.object(forKey: key) as AnyObject?
}
func removeUserDefaultsFor(key:String) {
UserDefaults.standard.removeObject(forKey: key)
UserDefaults.standard.synchronize()
}
//MARK:- PROPORTIONAL SIZE
let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
let SCREEN_WIDTH = UIScreen.main.bounds.size.width
func GET_PROPORTIONAL_WIDTH (width:CGFloat) -> CGFloat {
return ((SCREEN_WIDTH * width)/750)
}
func GET_PROPORTIONAL_HEIGHT (height:CGFloat) -> CGFloat {
return ((SCREEN_HEIGHT * height)/1334)
}
//MARK:- NETWORK ACTIVITY INDICATOR
func SHOW_NETWORK_ACTIVITY_INDICATOR(){
UIApplication.shared.isNetworkActivityIndicatorVisible = true
}
func HIDE_NETWORK_ACTIVITY_INDICATOR(){
UIApplication.shared.isNetworkActivityIndicatorVisible = false
}
//Check IsiPhone Device
func IS_IPHONE_DEVICE()->Bool{
let deviceType = UIDevice.current.userInterfaceIdiom == .phone
return deviceType
}
//Check IsiPad Device
func IS_IPAD_DEVICE()->Bool{
let deviceType = UIDevice.current.userInterfaceIdiom == .pad
return deviceType
}
//iPhone 4 OR 4S
func IS_IPHONE_4_OR_4S()->Bool{
let SCREEN_HEIGHT_TO_CHECK_AGAINST:CGFloat = 480
var device:Bool = false
if(SCREEN_HEIGHT_TO_CHECK_AGAINST == SCREEN_HEIGHT) {
device = true
}
return device
}
func proportionalFontSize() -> CGFloat {
var sizeToCheckAgainst = self
if(IS_IPAD_DEVICE()) {
sizeToCheckAgainst += 12
}
else {
if(IS_IPHONE_6P_OR_6SP()) {
sizeToCheckAgainst += 1
}
else if(IS_IPHONE_6_OR_6S()) {
sizeToCheckAgainst += 0
}
else if(IS_IPHONE_5_OR_5S()) {
sizeToCheckAgainst -= 1
}
else if(IS_IPHONE_4_OR_4S()) {
sizeToCheckAgainst -= 2
}
}
return sizeToCheckAgainst
}
//iPhone 5 OR OR 5C OR 4S
func IS_IPHONE_5_OR_5S()->Bool{
let SCREEN_HEIGHT_TO_CHECK_AGAINST:CGFloat = 568
var device:Bool = false
if(SCREEN_HEIGHT_TO_CHECK_AGAINST == SCREEN_HEIGHT) {
device = true
}
return device
}
//iPhone 6 OR 6S
func IS_IPHONE_6_OR_6S()->Bool{
let SCREEN_HEIGHT_TO_CHECK_AGAINST:CGFloat = 667
var device:Bool = false
if(SCREEN_HEIGHT_TO_CHECK_AGAINST == SCREEN_HEIGHT) {
device = true
}
return device
}
//iPhone 6Plus OR 6SPlus
func IS_IPHONE_6P_OR_6SP()->Bool{
let SCREEN_HEIGHT_TO_CHECK_AGAINST:CGFloat = 736
var device:Bool = false
if(SCREEN_HEIGHT_TO_CHECK_AGAINST == SCREEN_HEIGHT) {
device = true
}
return device
}
//MARK:- DEVICE ORIENTATION CHECK
func IS_DEVICE_PORTRAIT() -> Bool {
return UIDevice.current.orientation.isPortrait
}
func IS_DEVICE_LANDSCAPE() -> Bool {
return UIDevice.current.orientation.isLandscape
}
//MARK:- SYSTEM VERSION CHECK
func SYSTEM_VERSION_EQUAL_TO(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) == ComparisonResult.orderedSame
}
func SYSTEM_VERSION_GREATER_THAN(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) == ComparisonResult.orderedDescending
}
func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) != ComparisonResult.orderedAscending
}
func SYSTEM_VERSION_LESS_THAN(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) == ComparisonResult.orderedAscending
}
func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) != ComparisonResult.orderedDescending
}
}
这与我所说的没有什么不同。 – matt 2014-12-13 20:31:33
我喜欢扩展的想法。而且,你会在什么位置放置这个扩展? – 2014-12-13 23:03:08
没关系。我发现这个:https://www.youtube.com/watch?v = ENs97dVN_uk。谢谢! – 2014-12-13 23:17:10