From 965ac5530926affbebae26ecd7ef03485c1b3b15 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Thu, 20 Oct 2016 13:41:14 +0300 Subject: [PATCH 1/3] organize storyboard and view controller instantiation --- LeadKit/LeadKit.xcodeproj/project.pbxproj | 17 ++++++++++ .../Protocols/StoryboardProtocol.swift | 33 +++++++++++++++++++ .../StoryboardProtocol+Extensions.swift | 31 +++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 LeadKit/LeadKit/Protocols/StoryboardProtocol.swift create mode 100644 LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift diff --git a/LeadKit/LeadKit.xcodeproj/project.pbxproj b/LeadKit/LeadKit.xcodeproj/project.pbxproj index b52f2fdd..abfc8b1f 100644 --- a/LeadKit/LeadKit.xcodeproj/project.pbxproj +++ b/LeadKit/LeadKit.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ 78011AB31D48B53600EA16A2 /* ApiRequestParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78011AB21D48B53600EA16A2 /* ApiRequestParameters.swift */; }; 780D23431DA412470084620D /* CGImage+Alpha.swift in Sources */ = {isa = PBXBuildFile; fileRef = 780D23421DA412470084620D /* CGImage+Alpha.swift */; }; 780D23461DA416F80084620D /* CGContext+Initializers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 780D23451DA416F80084620D /* CGContext+Initializers.swift */; }; + 7834236A1DB8D0E100A79643 /* StoryboardProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 783423691DB8D0E100A79643 /* StoryboardProtocol.swift */; }; + 783423701DB8D15800A79643 /* StoryboardProtocol+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7834236F1DB8D15800A79643 /* StoryboardProtocol+Extensions.swift */; }; 7837F60F1CBCF5C0000D74C1 /* EstimatedViewHeightProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7837F60E1CBCF5C0000D74C1 /* EstimatedViewHeightProtocol.swift */; }; 786D78E81D53C378006B2CEA /* AlamofireRequest+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 786D78E71D53C378006B2CEA /* AlamofireRequest+Extensions.swift */; }; 786D78EC1D53C46E006B2CEA /* AlamofireManager+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 786D78EB1D53C46E006B2CEA /* AlamofireManager+Extensions.swift */; }; @@ -69,6 +71,8 @@ 78011AB21D48B53600EA16A2 /* ApiRequestParameters.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiRequestParameters.swift; sourceTree = ""; }; 780D23421DA412470084620D /* CGImage+Alpha.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CGImage+Alpha.swift"; sourceTree = ""; }; 780D23451DA416F80084620D /* CGContext+Initializers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CGContext+Initializers.swift"; sourceTree = ""; }; + 783423691DB8D0E100A79643 /* StoryboardProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardProtocol.swift; sourceTree = ""; }; + 7834236F1DB8D15800A79643 /* StoryboardProtocol+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "StoryboardProtocol+Extensions.swift"; sourceTree = ""; }; 7837F60E1CBCF5C0000D74C1 /* EstimatedViewHeightProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EstimatedViewHeightProtocol.swift; sourceTree = ""; }; 786D78E71D53C378006B2CEA /* AlamofireRequest+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AlamofireRequest+Extensions.swift"; sourceTree = ""; }; 786D78EB1D53C46E006B2CEA /* AlamofireManager+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AlamofireManager+Extensions.swift"; sourceTree = ""; }; @@ -197,6 +201,15 @@ path = CGContext; sourceTree = ""; }; + 7834236C1DB8D13E00A79643 /* StoryboardProtocol */ = { + isa = PBXGroup; + children = ( + 7834236F1DB8D15800A79643 /* StoryboardProtocol+Extensions.swift */, + ); + name = StoryboardProtocol; + path = LeadKit/StoryboardProtocol; + sourceTree = SOURCE_ROOT; + }; 786D78E61D53C355006B2CEA /* Alamofire */ = { isa = PBXGroup; children = ( @@ -314,6 +327,7 @@ 780D23411DA412330084620D /* CGImage */, 780D23441DA416E80084620D /* CGContext */, C372153938A7B7D327F55124 /* UIStoryboard */, + 7834236C1DB8D13E00A79643 /* StoryboardProtocol */, 78D4B5441DA64D31005B0764 /* UIViewController */, 786D78E61D53C355006B2CEA /* Alamofire */, ); @@ -332,6 +346,7 @@ 78CFEE501C5C45E500F50370 /* ViewModelProtocol.swift */, 787682F91CAD40C200532AB3 /* StaticEstimatedViewHeightProtocol.swift */, 7837F60E1CBCF5C0000D74C1 /* EstimatedViewHeightProtocol.swift */, + 783423691DB8D0E100A79643 /* StoryboardProtocol.swift */, ); path = Protocols; sourceTree = ""; @@ -558,9 +573,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 783423701DB8D15800A79643 /* StoryboardProtocol+Extensions.swift in Sources */, 7837F60F1CBCF5C0000D74C1 /* EstimatedViewHeightProtocol.swift in Sources */, 78CFEE541C5C45E500F50370 /* UIView+LoadFromNib.swift in Sources */, 78D4B5461DA64D49005B0764 /* UIViewController+DefaultStoryboardIdentifier.swift in Sources */, + 7834236A1DB8D0E100A79643 /* StoryboardProtocol.swift in Sources */, 78CFEE521C5C45E500F50370 /* UITableView+CellRegistration.swift in Sources */, 78B0FC7F1C6B2C4D00358B64 /* Log.swift in Sources */, 78D4B54A1DA64EAB005B0764 /* Any+TypeName.swift in Sources */, diff --git a/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift b/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift new file mode 100644 index 00000000..f26f6d5a --- /dev/null +++ b/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift @@ -0,0 +1,33 @@ +// +// StoryboardProtocol.swift +// LeadKit +// +// Created by Ivan Smolin on 20/10/16. +// Copyright © 2016 Touch Instinct. All rights reserved. +// + +import UIKit + +/** + * protocol which helps us organize storyboards and view controllers creation + */ +public protocol StoryboardProtocol { + + associatedtype StoryboardIdentifier: RawRepresentable + associatedtype ViewControllerIdentifier: RawRepresentable + + /** + - returns: storyboard identifier with associatedtype type + */ + static var storyboardIdentifier: StoryboardIdentifier { get } + + /** + method which instantiate UIViewControlle instance for specific view controller identifier + + - parameter _: object which represents view controller identifier + + - returns: UIViewController instance + */ + static func instantiateViewController(_: ViewControllerIdentifier) -> UIViewController + +} diff --git a/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift b/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift new file mode 100644 index 00000000..51c9a8c2 --- /dev/null +++ b/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift @@ -0,0 +1,31 @@ +// +// StoryboardProtocol+Extensions.swift +// LeadKit +// +// Created by Ivan Smolin on 20/10/16. +// Copyright © 2016 Touch Instinct. All rights reserved. +// + +import UIKit + +public extension StoryboardProtocol where StoryboardIdentifier.RawValue == String, ViewControllerIdentifier.RawValue == String { + + /** + - returns: UIStoryboradInstance with StoryboardIdentifier name + */ + public static var uiStoryboard: UIStoryboard { + return UIStoryboard(name: storyboardIdentifier.rawValue, bundle: Bundle.main) + } + + /** + method for instantiating UIViewController from storyboard using view controller identifier + + - parameter _: object which represents view controller identifier + + - returns: UIViewController instance + */ + public static func instantiateViewController(_ viewController: ViewControllerIdentifier) -> UIViewController { + return uiStoryboard.instantiateViewController(withIdentifier: viewController.rawValue) + } + +} From 1111dc6855c155da436cf3d4be49679fd8a6c442 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Thu, 20 Oct 2016 15:34:34 +0300 Subject: [PATCH 2/3] remove constraints for StoryboardIdentifier and ViewControllerIdentifier type --- LeadKit/LeadKit/Protocols/StoryboardProtocol.swift | 4 ++-- .../StoryboardProtocol/StoryboardProtocol+Extensions.swift | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift b/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift index f26f6d5a..415967c0 100644 --- a/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift +++ b/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift @@ -13,8 +13,8 @@ import UIKit */ public protocol StoryboardProtocol { - associatedtype StoryboardIdentifier: RawRepresentable - associatedtype ViewControllerIdentifier: RawRepresentable + associatedtype StoryboardIdentifier + associatedtype ViewControllerIdentifier /** - returns: storyboard identifier with associatedtype type diff --git a/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift b/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift index 51c9a8c2..87c3b0af 100644 --- a/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift +++ b/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift @@ -8,7 +8,9 @@ import UIKit -public extension StoryboardProtocol where StoryboardIdentifier.RawValue == String, ViewControllerIdentifier.RawValue == String { +public extension StoryboardProtocol where + StoryboardIdentifier: RawRepresentable, StoryboardIdentifier.RawValue == String, +ViewControllerIdentifier: RawRepresentable, ViewControllerIdentifier.RawValue == String { /** - returns: UIStoryboradInstance with StoryboardIdentifier name From a450d234535efce19744f52be321667f5411ebc9 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 21 Oct 2016 16:58:02 +0300 Subject: [PATCH 3/3] Add ability to customize bundle for storyboard initialization --- LeadKit/LeadKit.xcodeproj/project.pbxproj | 4 ++++ .../Protocols/StoryboardProtocol.swift | 5 +++++ .../StoryboardProtocol+DefaultBundle.swift | 20 +++++++++++++++++++ .../StoryboardProtocol+Extensions.swift | 2 +- 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+DefaultBundle.swift diff --git a/LeadKit/LeadKit.xcodeproj/project.pbxproj b/LeadKit/LeadKit.xcodeproj/project.pbxproj index abfc8b1f..d97ce45b 100644 --- a/LeadKit/LeadKit.xcodeproj/project.pbxproj +++ b/LeadKit/LeadKit.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 787682FA1CAD40C300532AB3 /* StaticEstimatedViewHeightProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 787682F91CAD40C200532AB3 /* StaticEstimatedViewHeightProtocol.swift */; }; 787783631CA03CA0001CDC9B /* IndexPath+ImmutableIndexPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 787783621CA03CA0001CDC9B /* IndexPath+ImmutableIndexPath.swift */; }; 787783671CA04D4A001CDC9B /* String+SizeCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 787783661CA04D4A001CDC9B /* String+SizeCalculation.swift */; }; + 788E86F71DBA556C009BF65A /* StoryboardProtocol+DefaultBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 788E86F61DBA556C009BF65A /* StoryboardProtocol+DefaultBundle.swift */; }; 788EC15A1CF64528009CFB6B /* UIStoryboard+InstantiateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 788EC1591CF64528009CFB6B /* UIStoryboard+InstantiateViewController.swift */; }; 78A74EA91C6B373700FE9724 /* UIView+DefaultNibName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78A74EA81C6B373700FE9724 /* UIView+DefaultNibName.swift */; }; 78B036411DA4D7060021D5CC /* UIImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B036401DA4D7060021D5CC /* UIImage+Extensions.swift */; }; @@ -79,6 +80,7 @@ 787682F91CAD40C200532AB3 /* StaticEstimatedViewHeightProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StaticEstimatedViewHeightProtocol.swift; sourceTree = ""; }; 787783621CA03CA0001CDC9B /* IndexPath+ImmutableIndexPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "IndexPath+ImmutableIndexPath.swift"; sourceTree = ""; }; 787783661CA04D4A001CDC9B /* String+SizeCalculation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+SizeCalculation.swift"; sourceTree = ""; }; + 788E86F61DBA556C009BF65A /* StoryboardProtocol+DefaultBundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "StoryboardProtocol+DefaultBundle.swift"; sourceTree = ""; }; 788EC1591CF64528009CFB6B /* UIStoryboard+InstantiateViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIStoryboard+InstantiateViewController.swift"; sourceTree = ""; }; 78A74EA81C6B373700FE9724 /* UIView+DefaultNibName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+DefaultNibName.swift"; path = "LeadKit/Extensions/UIView/UIView+DefaultNibName.swift"; sourceTree = SOURCE_ROOT; }; 78B036401DA4D7060021D5CC /* UIImage+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImage+Extensions.swift"; sourceTree = ""; }; @@ -205,6 +207,7 @@ isa = PBXGroup; children = ( 7834236F1DB8D15800A79643 /* StoryboardProtocol+Extensions.swift */, + 788E86F61DBA556C009BF65A /* StoryboardProtocol+DefaultBundle.swift */, ); name = StoryboardProtocol; path = LeadKit/StoryboardProtocol; @@ -594,6 +597,7 @@ 78C36F7E1D801E3E00E7EBEA /* Double+Rounding.swift in Sources */, 78CFEE551C5C45E500F50370 /* NibNameProtocol.swift in Sources */, 78CFEE561C5C45E500F50370 /* ReuseIdentifierProtocol.swift in Sources */, + 788E86F71DBA556C009BF65A /* StoryboardProtocol+DefaultBundle.swift in Sources */, 78B036411DA4D7060021D5CC /* UIImage+Extensions.swift in Sources */, 786D78E81D53C378006B2CEA /* AlamofireRequest+Extensions.swift in Sources */, 78C36F811D8021DD00E7EBEA /* UIColor+Hex.swift in Sources */, diff --git a/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift b/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift index 415967c0..855c34f9 100644 --- a/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift +++ b/LeadKit/LeadKit/Protocols/StoryboardProtocol.swift @@ -21,6 +21,11 @@ public protocol StoryboardProtocol { */ static var storyboardIdentifier: StoryboardIdentifier { get } + /** + - returns: bundle for storyboard initialization + */ + static var bundle: Bundle? { get } + /** method which instantiate UIViewControlle instance for specific view controller identifier diff --git a/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+DefaultBundle.swift b/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+DefaultBundle.swift new file mode 100644 index 00000000..a9383e47 --- /dev/null +++ b/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+DefaultBundle.swift @@ -0,0 +1,20 @@ +// +// StoryboardProtocol+DefaultBundle.swift +// LeadKit +// +// Created by Ivan Smolin on 21/10/16. +// Copyright © 2016 Touch Instinct. All rights reserved. +// + +import UIKit + +public extension StoryboardProtocol { + + /** + - returns: default bundle for storyboard initialization + */ + public static var bundle: Bundle? { + return Bundle.main + } + +} diff --git a/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift b/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift index 87c3b0af..250d7326 100644 --- a/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift +++ b/LeadKit/LeadKit/StoryboardProtocol/StoryboardProtocol+Extensions.swift @@ -16,7 +16,7 @@ ViewControllerIdentifier: RawRepresentable, ViewControllerIdentifier.RawValue == - returns: UIStoryboradInstance with StoryboardIdentifier name */ public static var uiStoryboard: UIStoryboard { - return UIStoryboard(name: storyboardIdentifier.rawValue, bundle: Bundle.main) + return UIStoryboard(name: storyboardIdentifier.rawValue, bundle: bundle) } /**