├── ReusableXibViews ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── ViewController.swift ├── MessageView.swift ├── UIView+Nib.swift ├── NibWrapped.swift ├── NibWrapperView.swift ├── AppDelegate.swift ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist ├── SceneDelegate.swift └── MessageView.xib └── ReusableXibViews.xcodeproj ├── project.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── xcuserdata └── matthiaslamoureux.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist └── project.pbxproj /ReusableXibViews/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ReusableXibViews.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ReusableXibViews.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ReusableXibViews.xcodeproj/xcuserdata/matthiaslamoureux.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ReusableXibViews.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /ReusableXibViews/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // ReusableXibViews 4 | // 5 | // Created by Matthias Lamoureux on 13/01/2020. 6 | // Copyright © 2020 QSC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | 13 | @NibWrapped(MessageView.self) 14 | @IBOutlet var messageView: UIView! 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | // Do any additional setup after loading the view. 19 | _messageView.message = "That's awesome !!!" 20 | _messageView.symbol = "heart" 21 | } 22 | 23 | 24 | } 25 | 26 | -------------------------------------------------------------------------------- /ReusableXibViews/MessageView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MessageView.swift 3 | // ReusableXibViews 4 | // 5 | // Created by Matthias Lamoureux on 13/01/2020. 6 | // Copyright © 2020 QSC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @IBDesignable class MessageViewWrapper : NibWrapperView { } 12 | 13 | class MessageView: UIView { 14 | @IBOutlet weak var messageLabel: UILabel! 15 | @IBOutlet weak var messageIcon: UIImageView! 16 | 17 | var message : String = "" { 18 | didSet { messageLabel.text = message } 19 | } 20 | 21 | var symbol : String = "" { 22 | didSet { messageIcon.image = UIImage(systemName: symbol) } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /ReusableXibViews/UIView+Nib.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Nib.swift 3 | // ReusableXibViews 4 | // 5 | // Created by Matthias Lamoureux on 13/01/2020. 6 | // Copyright © 2020 QSC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIView { 12 | /// Load the view from a nib file called with the name of the class 13 | /// 14 | /// - Note: The first object of the nib file **must** be of the matching class 15 | static func loadFromNib() -> Self { 16 | let bundle = Bundle(for: self) 17 | let nib = UINib(nibName: String(describing: self), bundle: bundle) 18 | return nib.instantiate(withOwner: nil, options: nil).first as! Self 19 | } 20 | } 21 | 22 | -------------------------------------------------------------------------------- /ReusableXibViews/NibWrapped.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NibWrapped.swift 3 | // ReusableXibViews 4 | // 5 | // Created by Matthias Lamoureux on 13/01/2020. 6 | // Copyright © 2020 QSC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// Property wrapper used to wrapp a view instanciated from a Nib 12 | @propertyWrapper @dynamicMemberLookup public struct NibWrapped { 13 | 14 | /// Initializer 15 | /// 16 | /// - Parameter type: Type of the wrapped view 17 | public init(_ type: T.Type) { } 18 | 19 | /// The wrapped value 20 | public var wrappedValue: UIView! 21 | 22 | /// The final view 23 | public var unwrapped: T { (wrappedValue as! NibWrapperView).contentView } 24 | 25 | /// Dynamic member lookup to transfer keypath to the final view 26 | public subscript(dynamicMember keyPath: KeyPath) -> U { unwrapped[keyPath: keyPath] } 27 | 28 | /// Dynamic member lookup to transfer writable keypath to the final view 29 | public subscript(dynamicMember keyPath: WritableKeyPath) -> U { 30 | get { unwrapped[keyPath: keyPath] } 31 | set { 32 | var unwrappedView = unwrapped 33 | unwrappedView[keyPath: keyPath] = newValue 34 | } 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /ReusableXibViews/NibWrapperView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NibWrapperView.swift 3 | // ReusableXibViews 4 | // 5 | // Created by Matthias Lamoureux on 13/01/2020. 6 | // Copyright © 2020 QSC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// Class used to wrap a view automatically loaded form a nib file 12 | class NibWrapperView: UIView { 13 | /// The view loaded from the nib 14 | var contentView: T 15 | 16 | required init?(coder: NSCoder) { 17 | contentView = T.loadFromNib() 18 | super.init(coder: coder) 19 | prepareContentView() 20 | } 21 | 22 | override init(frame: CGRect) { 23 | contentView = T.loadFromNib() 24 | super.init(frame: frame) 25 | prepareContentView() 26 | } 27 | 28 | private func prepareContentView() { 29 | contentView.translatesAutoresizingMaskIntoConstraints = false 30 | addSubview(contentView) 31 | 32 | contentView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true 33 | contentView.topAnchor.constraint(equalTo: topAnchor).isActive = true 34 | contentView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true 35 | contentView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true 36 | } 37 | 38 | override func prepareForInterfaceBuilder() { 39 | super.prepareForInterfaceBuilder() 40 | contentView.prepareForInterfaceBuilder() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /ReusableXibViews/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // ReusableXibViews 4 | // 5 | // Created by Matthias Lamoureux on 13/01/2020. 6 | // Copyright © 2020 QSC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | // MARK: UISceneSession Lifecycle 22 | 23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 24 | // Called when a new scene session is being created. 25 | // Use this method to select a configuration to create the new scene with. 26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 27 | } 28 | 29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 30 | // Called when the user discards a scene session. 31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 33 | } 34 | 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /ReusableXibViews/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /ReusableXibViews/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /ReusableXibViews/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UISceneConfigurationName 33 | Default Configuration 34 | UISceneDelegateClassName 35 | $(PRODUCT_MODULE_NAME).SceneDelegate 36 | UISceneStoryboardFile 37 | Main 38 | 39 | 40 | 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIMainStoryboardFile 45 | Main 46 | UIRequiredDeviceCapabilities 47 | 48 | armv7 49 | 50 | UISupportedInterfaceOrientations 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationLandscapeLeft 54 | UIInterfaceOrientationLandscapeRight 55 | 56 | UISupportedInterfaceOrientations~ipad 57 | 58 | UIInterfaceOrientationPortrait 59 | UIInterfaceOrientationPortraitUpsideDown 60 | UIInterfaceOrientationLandscapeLeft 61 | UIInterfaceOrientationLandscapeRight 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /ReusableXibViews/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // ReusableXibViews 4 | // 5 | // Created by Matthias Lamoureux on 13/01/2020. 6 | // Copyright © 2020 QSC. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 17 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 18 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 19 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 20 | guard let _ = (scene as? UIWindowScene) else { return } 21 | } 22 | 23 | func sceneDidDisconnect(_ scene: UIScene) { 24 | // Called as the scene is being released by the system. 25 | // This occurs shortly after the scene enters the background, or when its session is discarded. 26 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 27 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). 28 | } 29 | 30 | func sceneDidBecomeActive(_ scene: UIScene) { 31 | // Called when the scene has moved from an inactive state to an active state. 32 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 33 | } 34 | 35 | func sceneWillResignActive(_ scene: UIScene) { 36 | // Called when the scene will move from an active state to an inactive state. 37 | // This may occur due to temporary interruptions (ex. an incoming phone call). 38 | } 39 | 40 | func sceneWillEnterForeground(_ scene: UIScene) { 41 | // Called as the scene transitions from the background to the foreground. 42 | // Use this method to undo the changes made on entering the background. 43 | } 44 | 45 | func sceneDidEnterBackground(_ scene: UIScene) { 46 | // Called as the scene transitions from the foreground to the background. 47 | // Use this method to save data, release shared resources, and store enough scene-specific state information 48 | // to restore the scene back to its current state. 49 | } 50 | 51 | 52 | } 53 | 54 | -------------------------------------------------------------------------------- /ReusableXibViews/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /ReusableXibViews/MessageView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /ReusableXibViews.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D04B64DE23CCAAD0008804CF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04B64DD23CCAAD0008804CF /* AppDelegate.swift */; }; 11 | D04B64E023CCAAD0008804CF /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04B64DF23CCAAD0008804CF /* SceneDelegate.swift */; }; 12 | D04B64E223CCAAD0008804CF /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04B64E123CCAAD0008804CF /* ViewController.swift */; }; 13 | D04B64E523CCAAD0008804CF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D04B64E323CCAAD0008804CF /* Main.storyboard */; }; 14 | D04B64E723CCAAD1008804CF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D04B64E623CCAAD1008804CF /* Assets.xcassets */; }; 15 | D04B64EA23CCAAD1008804CF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D04B64E823CCAAD1008804CF /* LaunchScreen.storyboard */; }; 16 | D04B64F223CCACA6008804CF /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D04B64F123CCACA6008804CF /* MessageView.xib */; }; 17 | D04B64F423CCB356008804CF /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04B64F323CCB356008804CF /* MessageView.swift */; }; 18 | D04B64F623CCB639008804CF /* UIView+Nib.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04B64F523CCB639008804CF /* UIView+Nib.swift */; }; 19 | D04B64F823CCB67D008804CF /* NibWrapperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04B64F723CCB67D008804CF /* NibWrapperView.swift */; }; 20 | D0D052DD23CCC66B0026E6EB /* NibWrapped.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D052DC23CCC66B0026E6EB /* NibWrapped.swift */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXFileReference section */ 24 | D04B64DA23CCAAD0008804CF /* ReusableXibViews.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ReusableXibViews.app; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | D04B64DD23CCAAD0008804CF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 26 | D04B64DF23CCAAD0008804CF /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 27 | D04B64E123CCAAD0008804CF /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 28 | D04B64E423CCAAD0008804CF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 29 | D04B64E623CCAAD1008804CF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 30 | D04B64E923CCAAD1008804CF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 31 | D04B64EB23CCAAD1008804CF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | D04B64F123CCACA6008804CF /* MessageView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MessageView.xib; sourceTree = ""; }; 33 | D04B64F323CCB356008804CF /* MessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageView.swift; sourceTree = ""; }; 34 | D04B64F523CCB639008804CF /* UIView+Nib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Nib.swift"; sourceTree = ""; }; 35 | D04B64F723CCB67D008804CF /* NibWrapperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NibWrapperView.swift; sourceTree = ""; }; 36 | D0D052DC23CCC66B0026E6EB /* NibWrapped.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NibWrapped.swift; sourceTree = ""; }; 37 | /* End PBXFileReference section */ 38 | 39 | /* Begin PBXFrameworksBuildPhase section */ 40 | D04B64D723CCAAD0008804CF /* Frameworks */ = { 41 | isa = PBXFrameworksBuildPhase; 42 | buildActionMask = 2147483647; 43 | files = ( 44 | ); 45 | runOnlyForDeploymentPostprocessing = 0; 46 | }; 47 | /* End PBXFrameworksBuildPhase section */ 48 | 49 | /* Begin PBXGroup section */ 50 | D04B64D123CCAAD0008804CF = { 51 | isa = PBXGroup; 52 | children = ( 53 | D04B64DC23CCAAD0008804CF /* ReusableXibViews */, 54 | D04B64DB23CCAAD0008804CF /* Products */, 55 | ); 56 | sourceTree = ""; 57 | }; 58 | D04B64DB23CCAAD0008804CF /* Products */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | D04B64DA23CCAAD0008804CF /* ReusableXibViews.app */, 62 | ); 63 | name = Products; 64 | sourceTree = ""; 65 | }; 66 | D04B64DC23CCAAD0008804CF /* ReusableXibViews */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | D04B64DD23CCAAD0008804CF /* AppDelegate.swift */, 70 | D04B64DF23CCAAD0008804CF /* SceneDelegate.swift */, 71 | D04B64E123CCAAD0008804CF /* ViewController.swift */, 72 | D04B64E323CCAAD0008804CF /* Main.storyboard */, 73 | D04B64E623CCAAD1008804CF /* Assets.xcassets */, 74 | D04B64E823CCAAD1008804CF /* LaunchScreen.storyboard */, 75 | D04B64EB23CCAAD1008804CF /* Info.plist */, 76 | D04B64F123CCACA6008804CF /* MessageView.xib */, 77 | D04B64F323CCB356008804CF /* MessageView.swift */, 78 | D04B64F523CCB639008804CF /* UIView+Nib.swift */, 79 | D04B64F723CCB67D008804CF /* NibWrapperView.swift */, 80 | D0D052DC23CCC66B0026E6EB /* NibWrapped.swift */, 81 | ); 82 | path = ReusableXibViews; 83 | sourceTree = ""; 84 | }; 85 | /* End PBXGroup section */ 86 | 87 | /* Begin PBXNativeTarget section */ 88 | D04B64D923CCAAD0008804CF /* ReusableXibViews */ = { 89 | isa = PBXNativeTarget; 90 | buildConfigurationList = D04B64EE23CCAAD1008804CF /* Build configuration list for PBXNativeTarget "ReusableXibViews" */; 91 | buildPhases = ( 92 | D04B64D623CCAAD0008804CF /* Sources */, 93 | D04B64D723CCAAD0008804CF /* Frameworks */, 94 | D04B64D823CCAAD0008804CF /* Resources */, 95 | ); 96 | buildRules = ( 97 | ); 98 | dependencies = ( 99 | ); 100 | name = ReusableXibViews; 101 | productName = ReusableXibViews; 102 | productReference = D04B64DA23CCAAD0008804CF /* ReusableXibViews.app */; 103 | productType = "com.apple.product-type.application"; 104 | }; 105 | /* End PBXNativeTarget section */ 106 | 107 | /* Begin PBXProject section */ 108 | D04B64D223CCAAD0008804CF /* Project object */ = { 109 | isa = PBXProject; 110 | attributes = { 111 | LastSwiftUpdateCheck = 1130; 112 | LastUpgradeCheck = 1130; 113 | ORGANIZATIONNAME = QSC; 114 | TargetAttributes = { 115 | D04B64D923CCAAD0008804CF = { 116 | CreatedOnToolsVersion = 11.3; 117 | }; 118 | }; 119 | }; 120 | buildConfigurationList = D04B64D523CCAAD0008804CF /* Build configuration list for PBXProject "ReusableXibViews" */; 121 | compatibilityVersion = "Xcode 9.3"; 122 | developmentRegion = en; 123 | hasScannedForEncodings = 0; 124 | knownRegions = ( 125 | en, 126 | Base, 127 | ); 128 | mainGroup = D04B64D123CCAAD0008804CF; 129 | productRefGroup = D04B64DB23CCAAD0008804CF /* Products */; 130 | projectDirPath = ""; 131 | projectRoot = ""; 132 | targets = ( 133 | D04B64D923CCAAD0008804CF /* ReusableXibViews */, 134 | ); 135 | }; 136 | /* End PBXProject section */ 137 | 138 | /* Begin PBXResourcesBuildPhase section */ 139 | D04B64D823CCAAD0008804CF /* Resources */ = { 140 | isa = PBXResourcesBuildPhase; 141 | buildActionMask = 2147483647; 142 | files = ( 143 | D04B64F223CCACA6008804CF /* MessageView.xib in Resources */, 144 | D04B64EA23CCAAD1008804CF /* LaunchScreen.storyboard in Resources */, 145 | D04B64E723CCAAD1008804CF /* Assets.xcassets in Resources */, 146 | D04B64E523CCAAD0008804CF /* Main.storyboard in Resources */, 147 | ); 148 | runOnlyForDeploymentPostprocessing = 0; 149 | }; 150 | /* End PBXResourcesBuildPhase section */ 151 | 152 | /* Begin PBXSourcesBuildPhase section */ 153 | D04B64D623CCAAD0008804CF /* Sources */ = { 154 | isa = PBXSourcesBuildPhase; 155 | buildActionMask = 2147483647; 156 | files = ( 157 | D0D052DD23CCC66B0026E6EB /* NibWrapped.swift in Sources */, 158 | D04B64F423CCB356008804CF /* MessageView.swift in Sources */, 159 | D04B64E223CCAAD0008804CF /* ViewController.swift in Sources */, 160 | D04B64F823CCB67D008804CF /* NibWrapperView.swift in Sources */, 161 | D04B64DE23CCAAD0008804CF /* AppDelegate.swift in Sources */, 162 | D04B64F623CCB639008804CF /* UIView+Nib.swift in Sources */, 163 | D04B64E023CCAAD0008804CF /* SceneDelegate.swift in Sources */, 164 | ); 165 | runOnlyForDeploymentPostprocessing = 0; 166 | }; 167 | /* End PBXSourcesBuildPhase section */ 168 | 169 | /* Begin PBXVariantGroup section */ 170 | D04B64E323CCAAD0008804CF /* Main.storyboard */ = { 171 | isa = PBXVariantGroup; 172 | children = ( 173 | D04B64E423CCAAD0008804CF /* Base */, 174 | ); 175 | name = Main.storyboard; 176 | sourceTree = ""; 177 | }; 178 | D04B64E823CCAAD1008804CF /* LaunchScreen.storyboard */ = { 179 | isa = PBXVariantGroup; 180 | children = ( 181 | D04B64E923CCAAD1008804CF /* Base */, 182 | ); 183 | name = LaunchScreen.storyboard; 184 | sourceTree = ""; 185 | }; 186 | /* End PBXVariantGroup section */ 187 | 188 | /* Begin XCBuildConfiguration section */ 189 | D04B64EC23CCAAD1008804CF /* Debug */ = { 190 | isa = XCBuildConfiguration; 191 | buildSettings = { 192 | ALWAYS_SEARCH_USER_PATHS = NO; 193 | CLANG_ANALYZER_NONNULL = YES; 194 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 195 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 196 | CLANG_CXX_LIBRARY = "libc++"; 197 | CLANG_ENABLE_MODULES = YES; 198 | CLANG_ENABLE_OBJC_ARC = YES; 199 | CLANG_ENABLE_OBJC_WEAK = YES; 200 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 201 | CLANG_WARN_BOOL_CONVERSION = YES; 202 | CLANG_WARN_COMMA = YES; 203 | CLANG_WARN_CONSTANT_CONVERSION = YES; 204 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 205 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 206 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 207 | CLANG_WARN_EMPTY_BODY = YES; 208 | CLANG_WARN_ENUM_CONVERSION = YES; 209 | CLANG_WARN_INFINITE_RECURSION = YES; 210 | CLANG_WARN_INT_CONVERSION = YES; 211 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 212 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 213 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 214 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 215 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 216 | CLANG_WARN_STRICT_PROTOTYPES = YES; 217 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 218 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 219 | CLANG_WARN_UNREACHABLE_CODE = YES; 220 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 221 | COPY_PHASE_STRIP = NO; 222 | DEBUG_INFORMATION_FORMAT = dwarf; 223 | ENABLE_STRICT_OBJC_MSGSEND = YES; 224 | ENABLE_TESTABILITY = YES; 225 | GCC_C_LANGUAGE_STANDARD = gnu11; 226 | GCC_DYNAMIC_NO_PIC = NO; 227 | GCC_NO_COMMON_BLOCKS = YES; 228 | GCC_OPTIMIZATION_LEVEL = 0; 229 | GCC_PREPROCESSOR_DEFINITIONS = ( 230 | "DEBUG=1", 231 | "$(inherited)", 232 | ); 233 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 234 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 235 | GCC_WARN_UNDECLARED_SELECTOR = YES; 236 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 237 | GCC_WARN_UNUSED_FUNCTION = YES; 238 | GCC_WARN_UNUSED_VARIABLE = YES; 239 | IPHONEOS_DEPLOYMENT_TARGET = 13.2; 240 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 241 | MTL_FAST_MATH = YES; 242 | ONLY_ACTIVE_ARCH = YES; 243 | SDKROOT = iphoneos; 244 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 245 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 246 | }; 247 | name = Debug; 248 | }; 249 | D04B64ED23CCAAD1008804CF /* Release */ = { 250 | isa = XCBuildConfiguration; 251 | buildSettings = { 252 | ALWAYS_SEARCH_USER_PATHS = NO; 253 | CLANG_ANALYZER_NONNULL = YES; 254 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 255 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 256 | CLANG_CXX_LIBRARY = "libc++"; 257 | CLANG_ENABLE_MODULES = YES; 258 | CLANG_ENABLE_OBJC_ARC = YES; 259 | CLANG_ENABLE_OBJC_WEAK = YES; 260 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 261 | CLANG_WARN_BOOL_CONVERSION = YES; 262 | CLANG_WARN_COMMA = YES; 263 | CLANG_WARN_CONSTANT_CONVERSION = YES; 264 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 265 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 266 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 267 | CLANG_WARN_EMPTY_BODY = YES; 268 | CLANG_WARN_ENUM_CONVERSION = YES; 269 | CLANG_WARN_INFINITE_RECURSION = YES; 270 | CLANG_WARN_INT_CONVERSION = YES; 271 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 272 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 273 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 274 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 275 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 276 | CLANG_WARN_STRICT_PROTOTYPES = YES; 277 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 278 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 279 | CLANG_WARN_UNREACHABLE_CODE = YES; 280 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 281 | COPY_PHASE_STRIP = NO; 282 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 283 | ENABLE_NS_ASSERTIONS = NO; 284 | ENABLE_STRICT_OBJC_MSGSEND = YES; 285 | GCC_C_LANGUAGE_STANDARD = gnu11; 286 | GCC_NO_COMMON_BLOCKS = YES; 287 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 288 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 289 | GCC_WARN_UNDECLARED_SELECTOR = YES; 290 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 291 | GCC_WARN_UNUSED_FUNCTION = YES; 292 | GCC_WARN_UNUSED_VARIABLE = YES; 293 | IPHONEOS_DEPLOYMENT_TARGET = 13.2; 294 | MTL_ENABLE_DEBUG_INFO = NO; 295 | MTL_FAST_MATH = YES; 296 | SDKROOT = iphoneos; 297 | SWIFT_COMPILATION_MODE = wholemodule; 298 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 299 | VALIDATE_PRODUCT = YES; 300 | }; 301 | name = Release; 302 | }; 303 | D04B64EF23CCAAD1008804CF /* Debug */ = { 304 | isa = XCBuildConfiguration; 305 | buildSettings = { 306 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 307 | CODE_SIGN_STYLE = Automatic; 308 | DEVELOPMENT_TEAM = ZESASH83M5; 309 | INFOPLIST_FILE = ReusableXibViews/Info.plist; 310 | LD_RUNPATH_SEARCH_PATHS = ( 311 | "$(inherited)", 312 | "@executable_path/Frameworks", 313 | ); 314 | PRODUCT_BUNDLE_IDENTIFIER = com.qsc.ReusableXibViews; 315 | PRODUCT_NAME = "$(TARGET_NAME)"; 316 | SWIFT_VERSION = 5.0; 317 | TARGETED_DEVICE_FAMILY = "1,2"; 318 | }; 319 | name = Debug; 320 | }; 321 | D04B64F023CCAAD1008804CF /* Release */ = { 322 | isa = XCBuildConfiguration; 323 | buildSettings = { 324 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 325 | CODE_SIGN_STYLE = Automatic; 326 | DEVELOPMENT_TEAM = ZESASH83M5; 327 | INFOPLIST_FILE = ReusableXibViews/Info.plist; 328 | LD_RUNPATH_SEARCH_PATHS = ( 329 | "$(inherited)", 330 | "@executable_path/Frameworks", 331 | ); 332 | PRODUCT_BUNDLE_IDENTIFIER = com.qsc.ReusableXibViews; 333 | PRODUCT_NAME = "$(TARGET_NAME)"; 334 | SWIFT_VERSION = 5.0; 335 | TARGETED_DEVICE_FAMILY = "1,2"; 336 | }; 337 | name = Release; 338 | }; 339 | /* End XCBuildConfiguration section */ 340 | 341 | /* Begin XCConfigurationList section */ 342 | D04B64D523CCAAD0008804CF /* Build configuration list for PBXProject "ReusableXibViews" */ = { 343 | isa = XCConfigurationList; 344 | buildConfigurations = ( 345 | D04B64EC23CCAAD1008804CF /* Debug */, 346 | D04B64ED23CCAAD1008804CF /* Release */, 347 | ); 348 | defaultConfigurationIsVisible = 0; 349 | defaultConfigurationName = Release; 350 | }; 351 | D04B64EE23CCAAD1008804CF /* Build configuration list for PBXNativeTarget "ReusableXibViews" */ = { 352 | isa = XCConfigurationList; 353 | buildConfigurations = ( 354 | D04B64EF23CCAAD1008804CF /* Debug */, 355 | D04B64F023CCAAD1008804CF /* Release */, 356 | ); 357 | defaultConfigurationIsVisible = 0; 358 | defaultConfigurationName = Release; 359 | }; 360 | /* End XCConfigurationList section */ 361 | }; 362 | rootObject = D04B64D223CCAAD0008804CF /* Project object */; 363 | } 364 | --------------------------------------------------------------------------------