├── Demo ├── XXNibBridgeDemo │ ├── Images.xcassets │ │ ├── doge.imageset │ │ │ ├── doge@2x.png │ │ │ └── Contents.json │ │ ├── sark.imageset │ │ │ ├── sark@2x.png │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── LaunchImage.launchimage │ │ │ └── Contents.json │ ├── XXAppDelegate.m │ ├── XXDogeView.h │ ├── XXSarkView.h │ ├── XXConvensionCell.h │ ├── XXMainViewController.h │ ├── XXAppDelegate.h │ ├── XXDogeView.m │ ├── main.m │ ├── XXConvensionCell.m │ ├── XXSarkView.m │ ├── Info.plist │ ├── XXMainViewController.m │ ├── XXConvensionCell.xib │ ├── XXDogeView.xib │ ├── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard │ └── XXSarkView.xib ├── XXNibBridgeDemo.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcuserdata │ │ └── sunnyxx.xcuserdatad │ │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── XXNibBridgeDemo.xcscheme │ └── project.pbxproj └── XXNibBridgeDemoTests │ ├── Info.plist │ └── XXNibBridgeDemoTests.m ├── .gitignore ├── XXNibBridge.xcworkspace ├── xcuserdata │ └── sunnyxx.xcuserdatad │ │ ├── WorkspaceSettings.xcsettings │ │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist └── contents.xcworkspacedata ├── LICENSE ├── README.md ├── XXNibBridge.podspec └── XXNibBridge ├── XXNibBridge.h ├── XXNibConvention.h ├── XXNibConvention.m └── XXNibBridge.m /Demo/XXNibBridgeDemo/Images.xcassets/doge.imageset/doge@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunnyxx/XXNibBridge/HEAD/Demo/XXNibBridgeDemo/Images.xcassets/doge.imageset/doge@2x.png -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/Images.xcassets/sark.imageset/sark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunnyxx/XXNibBridge/HEAD/Demo/XXNibBridgeDemo/Images.xcassets/sark.imageset/sark@2x.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | XXNibBridgeDemo.xcworkspace/xcuserdata/sunnyxx.xcuserdatad/UserInterfaceState.xcuserstate 3 | 4 | XXNibBridge.xcworkspace/xcuserdata/sunnyxx.xcuserdatad/UserInterfaceState.xcuserstate 5 | 6 | *.xcuserstate 7 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // XXAppDelegate.m 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 14-7-4. 6 | // 7 | // 8 | 9 | #import "XXAppDelegate.h" 10 | 11 | @implementation XXAppDelegate 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXDogeView.h: -------------------------------------------------------------------------------- 1 | // 2 | // XXDogeView.h 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 14-7-2. 6 | // Copyright (c) 2014年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XXDogeView : UIView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXSarkView.h: -------------------------------------------------------------------------------- 1 | // 2 | // XXSarkView.h 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 14-7-2. 6 | // Copyright (c) 2014年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XXSarkView : UIView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXConvensionCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // XXConvensionCell.h 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 15/9/1. 6 | // Copyright (c) 2015年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XXConvensionCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXMainViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // XXMainViewController.h 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 15/9/1. 6 | // Copyright (c) 2015年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XXMainViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // XXAppDelegate.h 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 14-7-4. 6 | // 7 | // 8 | 9 | #import 10 | 11 | @interface XXAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXDogeView.m: -------------------------------------------------------------------------------- 1 | // 2 | // XXDogeView.m 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 14-7-2. 6 | // Copyright (c) 2014年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import "XXDogeView.h" 10 | #import "XXNibBridge.h" 11 | 12 | @interface XXDogeView () // Enable nib bridge 13 | 14 | @end 15 | 16 | @implementation XXDogeView 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 15/1/8. 6 | // Copyright (c) 2015年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "XXAppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([XXAppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /XXNibBridge.xcworkspace/xcuserdata/sunnyxx.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/Images.xcassets/doge.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x", 10 | "filename" : "doge@2x.png" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/Images.xcassets/sark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x", 10 | "filename" : "sark@2x.png" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXConvensionCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // XXConvensionCell.m 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 15/9/1. 6 | // Copyright (c) 2015年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import "XXConvensionCell.h" 10 | 11 | @implementation XXConvensionCell 12 | 13 | - (void)awakeFromNib { 14 | // Initialization code 15 | } 16 | 17 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 18 | [super setSelected:selected animated:animated]; 19 | 20 | // Configure the view for the selected state 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "60x60", 21 | "scale" : "3x" 22 | } 23 | ], 24 | "info" : { 25 | "version" : 1, 26 | "author" : "xcode" 27 | } 28 | } -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXSarkView.m: -------------------------------------------------------------------------------- 1 | // 2 | // XXSarkView.m 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 14-7-2. 6 | // Copyright (c) 2014年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import "XXSarkView.h" 10 | #import "XXNibBridge.h" 11 | #import "XXDogeView.h" 12 | 13 | @interface XXSarkView () // Enable nib bridge 14 | @property (nonatomic, weak) IBOutlet XXDogeView *dogeView; 15 | @property (nonatomic, weak) IBOutlet NSLayoutConstraint *heightConstraint; 16 | @end 17 | 18 | @implementation XXSarkView 19 | 20 | - (void)awakeFromNib { 21 | // IBOutlets are fine 22 | self.dogeView.layer.cornerRadius = 5; 23 | self.heightConstraint.constant = 81; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo.xcodeproj/xcuserdata/sunnyxx.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | XXNibBridgeDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 48B78BB21A5E382400B662F7 16 | 17 | primary 18 | 19 | 20 | 48B78BCB1A5E382400B662F7 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /XXNibBridge.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18 | 19 | 21 | 22 | 23 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemoTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | sunnyxx.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemoTests/XXNibBridgeDemoTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // XXNibBridgeDemoTests.m 3 | // XXNibBridgeDemoTests 4 | // 5 | // Created by sunnyxx on 15/1/8. 6 | // Copyright (c) 2015年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface XXNibBridgeDemoTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation XXNibBridgeDemoTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | // This is an example of a functional test case. 30 | XCTAssert(YES, @"Pass"); 31 | } 32 | 33 | - (void)testPerformanceExample { 34 | // This is an example of a performance test case. 35 | [self measureBlock:^{ 36 | // Put the code you want to measure the time of here. 37 | }]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 sunnyxx 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | XXNibBridge 2 | =========== 3 | 4 | # Installation 5 | 6 | `pod 'XXNibBridge', '~> 2.3.0'` 7 | 8 | or `pod search XXNibBridge` to check 9 | 10 | # Overview 11 | 12 | `XXNibBridge` bridges `xib` file to storyboards or another xib file 13 | 14 | Design time: 15 | 16 | 17 | 18 | Runtime: 19 | 20 | 21 | 22 | ----- 23 | 24 | # How to use 25 | 26 | 1. Build your view class and its xib file. (Same name required) 27 | 28 | 29 | 30 | 2. Put a placeholder view in target IB (xib or storyboard), Set its class. 31 | 32 | 33 | 34 | 3. Conform to `XXNibBridge` and NOTHING to be implemented 35 | 36 | ``` objc 37 | #import 38 | @interface XXDogeView () 39 | @end 40 | ``` 41 | 42 | Done: 43 | 44 | 45 | # How it works 46 | 47 | 中文介绍请见[我的blog](http://blog.sunnyxx.com/2014/07/01/ios_ib_bridge/) 48 | 49 | 50 | -------------------------------------------------------------------------------- /XXNibBridge.podspec: -------------------------------------------------------------------------------- 1 | 2 | Pod::Spec.new do |s| 3 | s.name = "XXNibBridge" 4 | s.version = "2.3.1" 5 | s.summary = "XXNibBridge" 6 | s.description = "Bridge a nib file to another nib or storyboard" 7 | s.homepage = "https://github.com/sunnyxx/XXNibBridge" 8 | s.screenshots = "https://camo.githubusercontent.com/79e8b3019e36b99f796966f8df118e18576ff781/687474703a2f2f7777322e73696e61696d672e636e2f6c617267652f353135333035383367773165687a676b6c696b34326a32306d3830676f3075612e6a7067" 9 | 10 | # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 11 | s.license = { :type => "MIT", :file => "LICENSE" } 12 | 13 | # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 14 | s.author = { "sunnyxx" => "sunyuan1713@gmail.com" } 15 | # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 16 | s.platform = :ios, "6.0" 17 | # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 18 | s.source = { :git => "https://github.com/sunnyxx/XXNibBridge.git", :tag => "2.3.1" } 19 | # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 20 | s.source_files = "XXNibBridge/*.{h,m}" 21 | # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 22 | s.requires_arc = true 23 | end 24 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | sunnyxx.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXMainViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // XXMainViewController.m 3 | // XXNibBridgeDemo 4 | // 5 | // Created by sunnyxx on 15/9/1. 6 | // Copyright (c) 2015年 sunnyxx. All rights reserved. 7 | // 8 | 9 | #import "XXMainViewController.h" 10 | #import "XXNibConvention.h" 11 | #import "XXConvensionCell.h" 12 | 13 | @interface XXMainViewController () 14 | @property (nonatomic, weak) IBOutlet UITableView *tableView; 15 | @end 16 | 17 | @implementation XXMainViewController 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | // Use convention for cell reuse identifier. 23 | [self.tableView registerNib:[XXConvensionCell nib] forCellReuseIdentifier:[XXConvensionCell nibid]]; 24 | } 25 | 26 | #pragma mark - UITableViewDataSource 27 | 28 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 29 | return 1; 30 | } 31 | 32 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 33 | return 1; 34 | } 35 | 36 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 37 | return [tableView dequeueReusableCellWithIdentifier:[XXConvensionCell nibid]]; 38 | } 39 | 40 | #pragma mark - UITableViewDelegate 41 | 42 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 43 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 44 | [self performSegueWithIdentifier:@"DetailSegue" sender:nil]; 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /XXNibBridge/XXNibBridge.h: -------------------------------------------------------------------------------- 1 | // XXNibBridge.h 2 | // Version 2.2 3 | // 4 | // Copyright (c) 2015 sunnyxx ( http://github.com/sunnyxx ) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import "XXNibConvention.h" 25 | 26 | /// Any subclass of UIView that conforms to this protocol is considered accept nib bridge. 27 | /// Usage: 28 | /// 29 | /// @interface FooView () 30 | /// @end 31 | /// 32 | @protocol XXNibBridge 33 | @end -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXConvensionCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /XXNibBridge/XXNibConvention.h: -------------------------------------------------------------------------------- 1 | // XXNibConvention.h 2 | // Version 2.2 3 | // 4 | // Copyright (c) 2015 sunnyxx ( http://github.com/sunnyxx ) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import 25 | 26 | @protocol XXNibConvention 27 | 28 | /// Class name by convention. 29 | + (NSString *)nibid; 30 | 31 | /// Nib file in main bundle with class name by convention. 32 | + (UINib *)nib; 33 | 34 | @end 35 | 36 | @protocol XXDeprecatedNibConvention 37 | 38 | /// See `+ nibid`, I don't like this selector. 39 | + (NSString *)xx_nibID; 40 | 41 | /// See `+ nib`, I don't like this selector. 42 | + (UINib *)xx_nib; 43 | 44 | @end 45 | 46 | @interface UIView (XXNibConvention) 47 | 48 | /// Instantiate from `+ nib` with no owner, no options. 49 | /// 50 | /// Required: 51 | /// FooView.h, FooView.m, FooView.xib 52 | /// Usage: 53 | /// FooView *view = [FooView xx_instantiateFromNib]; 54 | /// 55 | + (id)xx_instantiateFromNib; 56 | 57 | /// See `+ xx_instantiateFromNib` but with bundle and owner. 58 | + (id)xx_instantiateFromNibInBundle:(NSBundle *)bundle owner:(id)owner; 59 | 60 | @end 61 | 62 | @interface UIViewController (XXNibConvention) 63 | 64 | /// Instantiate from given storyboard which class name as its `storyboard identifier` 65 | + (id)xx_instantiateFromStoryboardNamed:(NSString *)name; 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /XXNibBridge.xcworkspace/xcuserdata/sunnyxx.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 18 | 24 | 25 | 33 | 34 | 35 | 36 | 37 | 39 | 45 | 46 | 54 | 55 | 56 | 57 | 58 | 60 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXDogeView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /XXNibBridge/XXNibConvention.m: -------------------------------------------------------------------------------- 1 | // XXNibConvention.m 2 | // Version 2.2 3 | // 4 | // Copyright (c) 2015 sunnyxx ( http://github.com/sunnyxx ) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import "XXNibConvention.h" 25 | 26 | @implementation UIView (XXNibConvention) 27 | 28 | #pragma mark - XXNibConvention 29 | 30 | + (NSString *)nibid { 31 | NSString *className = NSStringFromClass(self); 32 | if ([className rangeOfString:@"."].location != NSNotFound) { 33 | // Swift class name contains module name 34 | return [className componentsSeparatedByString:@"."].lastObject; 35 | } 36 | return className; 37 | } 38 | 39 | + (UINib *)nib { 40 | return [UINib nibWithNibName:self.nibid bundle:nil]; 41 | } 42 | 43 | #pragma mark - XXDeprecatedNibConvention 44 | 45 | + (NSString *)xx_nibID { 46 | return self.nibid; 47 | } 48 | 49 | + (UINib *)xx_nib { 50 | return self.nib; 51 | } 52 | 53 | #pragma mark - Public 54 | 55 | + (id)xx_instantiateFromNib { 56 | return [self xx_instantiateFromNibInBundle:nil owner:nil]; 57 | } 58 | 59 | + (id)xx_instantiateFromNibInBundle:(NSBundle *)bundle owner:(id)owner { 60 | NSArray *views = [self.xx_nib instantiateWithOwner:owner options:nil]; 61 | for (UIView *view in views) { 62 | if ([view isMemberOfClass:self.class]) { 63 | return view; 64 | } 65 | } 66 | NSAssert(NO, @"Expect file: %@", [NSString stringWithFormat:@"%@.xib", self.nibid]); 67 | return nil; 68 | } 69 | 70 | @end 71 | 72 | @implementation UIViewController (XXNibConvention) 73 | 74 | #pragma mark - XXNibConvention 75 | 76 | + (NSString *)nibid { 77 | return NSStringFromClass(self); 78 | } 79 | 80 | + (UINib *)nib { 81 | return [UINib nibWithNibName:self.nibid bundle:nil]; 82 | } 83 | 84 | #pragma mark - XXDeprecatedNibConvention 85 | 86 | + (NSString *)xx_nibID { 87 | return self.nibid; 88 | } 89 | 90 | + (UINib *)xx_nib { 91 | return self.nib; 92 | } 93 | 94 | #pragma mark - Public 95 | 96 | + (id)xx_instantiateFromStoryboardNamed:(NSString *)name { 97 | NSParameterAssert(name.length > 0); 98 | UIStoryboard *storyboard = [UIStoryboard storyboardWithName:name bundle:nil]; 99 | NSAssert(storyboard != nil, @"Expect file: %@", [NSString stringWithFormat:@"%@.storyboard", name]); 100 | return [storyboard instantiateViewControllerWithIdentifier:self.nibid]; 101 | } 102 | 103 | @end 104 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo.xcodeproj/xcuserdata/sunnyxx.xcuserdatad/xcschemes/XXNibBridgeDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/XXSarkView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 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 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /XXNibBridge/XXNibBridge.m: -------------------------------------------------------------------------------- 1 | // XXNibBridge.m 2 | // Version 2.2 3 | // 4 | // Copyright (c) 2015 sunnyxx ( http://github.com/sunnyxx ) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import "XXNibBridge.h" 25 | #import 26 | 27 | @interface XXNibBridgeImplementation : NSObject 28 | /// `NS_REPLACES_RECEIVER` attribute is a must for right ownership for `self` under ARC. 29 | - (id)hackedAwakeAfterUsingCoder:(NSCoder *)decoder NS_REPLACES_RECEIVER; 30 | @end 31 | 32 | @implementation XXNibBridgeImplementation 33 | 34 | + (void)load { 35 | static dispatch_once_t onceToken; 36 | dispatch_once(&onceToken, ^{ 37 | SEL originalSelector = @selector(awakeAfterUsingCoder:); 38 | SEL swizzledSelector = @selector(hackedAwakeAfterUsingCoder:); 39 | Method originalMethod = class_getInstanceMethod(UIView.class, originalSelector); 40 | Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector); 41 | if (class_addMethod(UIView.class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) { 42 | class_replaceMethod(UIView.class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); 43 | } else { 44 | method_exchangeImplementations(originalMethod, swizzledMethod); 45 | } 46 | }); 47 | } 48 | 49 | - (id)hackedAwakeAfterUsingCoder:(NSCoder *)decoder { 50 | if ([self.class conformsToProtocol:@protocol(XXNibBridge)] && ((UIView *)self).subviews.count == 0) { 51 | // "self" is placeholder view for this moment, replace it. 52 | return [XXNibBridgeImplementation instantiateRealViewFromPlaceholder:(UIView *)self]; 53 | } 54 | return self; 55 | } 56 | 57 | + (UIView *)instantiateRealViewFromPlaceholder:(UIView *)placeholderView { 58 | 59 | // Required to conform `XXNibConvension`. 60 | UIView *realView = [[placeholderView class] xx_instantiateFromNib]; 61 | 62 | realView.tag = placeholderView.tag; 63 | realView.frame = placeholderView.frame; 64 | realView.bounds = placeholderView.bounds; 65 | realView.hidden = placeholderView.hidden; 66 | realView.clipsToBounds = placeholderView.clipsToBounds; 67 | realView.autoresizingMask = placeholderView.autoresizingMask; 68 | realView.userInteractionEnabled = placeholderView.userInteractionEnabled; 69 | realView.translatesAutoresizingMaskIntoConstraints = placeholderView.translatesAutoresizingMaskIntoConstraints; 70 | 71 | // Copy autolayout constrains. 72 | if (placeholderView.constraints.count > 0) { 73 | 74 | // We only need to copy "self" constraints (like width/height constraints) 75 | // from placeholder to real view 76 | for (NSLayoutConstraint *constraint in placeholderView.constraints) { 77 | 78 | NSLayoutConstraint* newConstraint; 79 | 80 | // "Height" or "Width" constraint 81 | // "self" as its first item, no second item 82 | if (!constraint.secondItem) { 83 | newConstraint = 84 | [NSLayoutConstraint constraintWithItem:realView 85 | attribute:constraint.firstAttribute 86 | relatedBy:constraint.relation 87 | toItem:nil 88 | attribute:constraint.secondAttribute 89 | multiplier:constraint.multiplier 90 | constant:constraint.constant]; 91 | } 92 | // "Aspect ratio" constraint 93 | // "self" as its first AND second item 94 | else if ([constraint.firstItem isEqual:constraint.secondItem]) { 95 | newConstraint = 96 | [NSLayoutConstraint constraintWithItem:realView 97 | attribute:constraint.firstAttribute 98 | relatedBy:constraint.relation 99 | toItem:realView 100 | attribute:constraint.secondAttribute 101 | multiplier:constraint.multiplier 102 | constant:constraint.constant]; 103 | } 104 | 105 | // Copy properties to new constraint 106 | if (newConstraint) { 107 | newConstraint.shouldBeArchived = constraint.shouldBeArchived; 108 | newConstraint.priority = constraint.priority; 109 | if ([UIDevice currentDevice].systemVersion.floatValue >= 7.0f) { 110 | newConstraint.identifier = constraint.identifier; 111 | } 112 | [realView addConstraint:newConstraint]; 113 | } 114 | } 115 | } 116 | 117 | return realView; 118 | } 119 | 120 | @end 121 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo/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 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /Demo/XXNibBridgeDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 488DAAFD1B95BA2A00680E56 /* XXConvensionCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 488DAAFB1B95BA2A00680E56 /* XXConvensionCell.m */; }; 11 | 488DAAFE1B95BA2A00680E56 /* XXConvensionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 488DAAFC1B95BA2A00680E56 /* XXConvensionCell.xib */; }; 12 | 488DAB011B95BA4400680E56 /* XXMainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 488DAB001B95BA4400680E56 /* XXMainViewController.m */; }; 13 | 48ADAFEE1A5FD274008F2ED8 /* XXNibConvention.m in Sources */ = {isa = PBXBuildFile; fileRef = 48ADAFED1A5FD274008F2ED8 /* XXNibConvention.m */; }; 14 | 48B78BB91A5E382400B662F7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 48B78BB81A5E382400B662F7 /* main.m */; }; 15 | 48B78BC21A5E382400B662F7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 48B78BC01A5E382400B662F7 /* Main.storyboard */; }; 16 | 48B78BC41A5E382400B662F7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 48B78BC31A5E382400B662F7 /* Images.xcassets */; }; 17 | 48B78BC71A5E382400B662F7 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 48B78BC51A5E382400B662F7 /* LaunchScreen.xib */; }; 18 | 48B78BD31A5E382400B662F7 /* XXNibBridgeDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 48B78BD21A5E382400B662F7 /* XXNibBridgeDemoTests.m */; }; 19 | 48B78BDF1A5E38AF00B662F7 /* XXNibBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 48B78BDE1A5E38AF00B662F7 /* XXNibBridge.m */; }; 20 | 48B78BE81A5E6B2700B662F7 /* XXAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 48B78BE11A5E6B2700B662F7 /* XXAppDelegate.m */; }; 21 | 48B78BE91A5E6B2700B662F7 /* XXDogeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 48B78BE31A5E6B2700B662F7 /* XXDogeView.m */; }; 22 | 48B78BEA1A5E6B2700B662F7 /* XXDogeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 48B78BE41A5E6B2700B662F7 /* XXDogeView.xib */; }; 23 | 48B78BEB1A5E6B2700B662F7 /* XXSarkView.m in Sources */ = {isa = PBXBuildFile; fileRef = 48B78BE61A5E6B2700B662F7 /* XXSarkView.m */; }; 24 | 48B78BEC1A5E6B2700B662F7 /* XXSarkView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 48B78BE71A5E6B2700B662F7 /* XXSarkView.xib */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXContainerItemProxy section */ 28 | 48B78BCD1A5E382400B662F7 /* PBXContainerItemProxy */ = { 29 | isa = PBXContainerItemProxy; 30 | containerPortal = 48B78BAB1A5E382400B662F7 /* Project object */; 31 | proxyType = 1; 32 | remoteGlobalIDString = 48B78BB21A5E382400B662F7; 33 | remoteInfo = XXNibBridgeDemo; 34 | }; 35 | /* End PBXContainerItemProxy section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 488DAAFA1B95BA2A00680E56 /* XXConvensionCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XXConvensionCell.h; sourceTree = ""; }; 39 | 488DAAFB1B95BA2A00680E56 /* XXConvensionCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XXConvensionCell.m; sourceTree = ""; }; 40 | 488DAAFC1B95BA2A00680E56 /* XXConvensionCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = XXConvensionCell.xib; sourceTree = ""; }; 41 | 488DAAFF1B95BA4400680E56 /* XXMainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XXMainViewController.h; sourceTree = ""; }; 42 | 488DAB001B95BA4400680E56 /* XXMainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XXMainViewController.m; sourceTree = ""; }; 43 | 48ADAFEC1A5FD274008F2ED8 /* XXNibConvention.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XXNibConvention.h; sourceTree = ""; }; 44 | 48ADAFED1A5FD274008F2ED8 /* XXNibConvention.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XXNibConvention.m; sourceTree = ""; }; 45 | 48B78BB31A5E382400B662F7 /* XXNibBridgeDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XXNibBridgeDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 48B78BB71A5E382400B662F7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | 48B78BB81A5E382400B662F7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 48 | 48B78BC11A5E382400B662F7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 49 | 48B78BC31A5E382400B662F7 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 50 | 48B78BC61A5E382400B662F7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 51 | 48B78BCC1A5E382400B662F7 /* XXNibBridgeDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XXNibBridgeDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 48B78BD11A5E382400B662F7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53 | 48B78BD21A5E382400B662F7 /* XXNibBridgeDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XXNibBridgeDemoTests.m; sourceTree = ""; }; 54 | 48B78BDD1A5E38AF00B662F7 /* XXNibBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XXNibBridge.h; sourceTree = ""; }; 55 | 48B78BDE1A5E38AF00B662F7 /* XXNibBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XXNibBridge.m; sourceTree = ""; }; 56 | 48B78BE01A5E6B2700B662F7 /* XXAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XXAppDelegate.h; sourceTree = ""; }; 57 | 48B78BE11A5E6B2700B662F7 /* XXAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XXAppDelegate.m; sourceTree = ""; }; 58 | 48B78BE21A5E6B2700B662F7 /* XXDogeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XXDogeView.h; sourceTree = ""; }; 59 | 48B78BE31A5E6B2700B662F7 /* XXDogeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XXDogeView.m; sourceTree = ""; }; 60 | 48B78BE41A5E6B2700B662F7 /* XXDogeView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = XXDogeView.xib; sourceTree = ""; }; 61 | 48B78BE51A5E6B2700B662F7 /* XXSarkView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XXSarkView.h; sourceTree = ""; }; 62 | 48B78BE61A5E6B2700B662F7 /* XXSarkView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XXSarkView.m; sourceTree = ""; }; 63 | 48B78BE71A5E6B2700B662F7 /* XXSarkView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = XXSarkView.xib; sourceTree = ""; }; 64 | /* End PBXFileReference section */ 65 | 66 | /* Begin PBXFrameworksBuildPhase section */ 67 | 48B78BB01A5E382400B662F7 /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | ); 72 | runOnlyForDeploymentPostprocessing = 0; 73 | }; 74 | 48B78BC91A5E382400B662F7 /* Frameworks */ = { 75 | isa = PBXFrameworksBuildPhase; 76 | buildActionMask = 2147483647; 77 | files = ( 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | /* End PBXFrameworksBuildPhase section */ 82 | 83 | /* Begin PBXGroup section */ 84 | 488DAAF91B95B9F900680E56 /* Nib Convention */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 488DAAFA1B95BA2A00680E56 /* XXConvensionCell.h */, 88 | 488DAAFB1B95BA2A00680E56 /* XXConvensionCell.m */, 89 | 488DAAFC1B95BA2A00680E56 /* XXConvensionCell.xib */, 90 | ); 91 | name = "Nib Convention"; 92 | sourceTree = ""; 93 | }; 94 | 48B78BAA1A5E382400B662F7 = { 95 | isa = PBXGroup; 96 | children = ( 97 | 48B78BB51A5E382400B662F7 /* XXNibBridgeDemo */, 98 | 48B78BCF1A5E382400B662F7 /* XXNibBridgeDemoTests */, 99 | 48B78BB41A5E382400B662F7 /* Products */, 100 | ); 101 | sourceTree = ""; 102 | }; 103 | 48B78BB41A5E382400B662F7 /* Products */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 48B78BB31A5E382400B662F7 /* XXNibBridgeDemo.app */, 107 | 48B78BCC1A5E382400B662F7 /* XXNibBridgeDemoTests.xctest */, 108 | ); 109 | name = Products; 110 | sourceTree = ""; 111 | }; 112 | 48B78BB51A5E382400B662F7 /* XXNibBridgeDemo */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 48B78BE01A5E6B2700B662F7 /* XXAppDelegate.h */, 116 | 48B78BE11A5E6B2700B662F7 /* XXAppDelegate.m */, 117 | 488DAAFF1B95BA4400680E56 /* XXMainViewController.h */, 118 | 488DAB001B95BA4400680E56 /* XXMainViewController.m */, 119 | 48B78BC01A5E382400B662F7 /* Main.storyboard */, 120 | 48B78BC31A5E382400B662F7 /* Images.xcassets */, 121 | 48B78BC51A5E382400B662F7 /* LaunchScreen.xib */, 122 | 488DAAF91B95B9F900680E56 /* Nib Convention */, 123 | 48FAE4871A67AE3E003F1D6B /* Bridge Views */, 124 | 48B78BDC1A5E38AF00B662F7 /* XXNibBridge Classes */, 125 | 48B78BB61A5E382400B662F7 /* Supporting Files */, 126 | ); 127 | path = XXNibBridgeDemo; 128 | sourceTree = ""; 129 | }; 130 | 48B78BB61A5E382400B662F7 /* Supporting Files */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 48B78BB71A5E382400B662F7 /* Info.plist */, 134 | 48B78BB81A5E382400B662F7 /* main.m */, 135 | ); 136 | name = "Supporting Files"; 137 | sourceTree = ""; 138 | }; 139 | 48B78BCF1A5E382400B662F7 /* XXNibBridgeDemoTests */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 48B78BD21A5E382400B662F7 /* XXNibBridgeDemoTests.m */, 143 | 48B78BD01A5E382400B662F7 /* Supporting Files */, 144 | ); 145 | path = XXNibBridgeDemoTests; 146 | sourceTree = ""; 147 | }; 148 | 48B78BD01A5E382400B662F7 /* Supporting Files */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 48B78BD11A5E382400B662F7 /* Info.plist */, 152 | ); 153 | name = "Supporting Files"; 154 | sourceTree = ""; 155 | }; 156 | 48B78BDC1A5E38AF00B662F7 /* XXNibBridge Classes */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 48B78BDD1A5E38AF00B662F7 /* XXNibBridge.h */, 160 | 48B78BDE1A5E38AF00B662F7 /* XXNibBridge.m */, 161 | 48ADAFEC1A5FD274008F2ED8 /* XXNibConvention.h */, 162 | 48ADAFED1A5FD274008F2ED8 /* XXNibConvention.m */, 163 | ); 164 | name = "XXNibBridge Classes"; 165 | path = ../../XXNibBridge; 166 | sourceTree = ""; 167 | }; 168 | 48FAE4871A67AE3E003F1D6B /* Bridge Views */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | 48B78BE21A5E6B2700B662F7 /* XXDogeView.h */, 172 | 48B78BE31A5E6B2700B662F7 /* XXDogeView.m */, 173 | 48B78BE41A5E6B2700B662F7 /* XXDogeView.xib */, 174 | 48B78BE51A5E6B2700B662F7 /* XXSarkView.h */, 175 | 48B78BE61A5E6B2700B662F7 /* XXSarkView.m */, 176 | 48B78BE71A5E6B2700B662F7 /* XXSarkView.xib */, 177 | ); 178 | name = "Bridge Views"; 179 | sourceTree = ""; 180 | }; 181 | /* End PBXGroup section */ 182 | 183 | /* Begin PBXNativeTarget section */ 184 | 48B78BB21A5E382400B662F7 /* XXNibBridgeDemo */ = { 185 | isa = PBXNativeTarget; 186 | buildConfigurationList = 48B78BD61A5E382400B662F7 /* Build configuration list for PBXNativeTarget "XXNibBridgeDemo" */; 187 | buildPhases = ( 188 | 48B78BAF1A5E382400B662F7 /* Sources */, 189 | 48B78BB01A5E382400B662F7 /* Frameworks */, 190 | 48B78BB11A5E382400B662F7 /* Resources */, 191 | ); 192 | buildRules = ( 193 | ); 194 | dependencies = ( 195 | ); 196 | name = XXNibBridgeDemo; 197 | productName = XXNibBridgeDemo; 198 | productReference = 48B78BB31A5E382400B662F7 /* XXNibBridgeDemo.app */; 199 | productType = "com.apple.product-type.application"; 200 | }; 201 | 48B78BCB1A5E382400B662F7 /* XXNibBridgeDemoTests */ = { 202 | isa = PBXNativeTarget; 203 | buildConfigurationList = 48B78BD91A5E382400B662F7 /* Build configuration list for PBXNativeTarget "XXNibBridgeDemoTests" */; 204 | buildPhases = ( 205 | 48B78BC81A5E382400B662F7 /* Sources */, 206 | 48B78BC91A5E382400B662F7 /* Frameworks */, 207 | 48B78BCA1A5E382400B662F7 /* Resources */, 208 | ); 209 | buildRules = ( 210 | ); 211 | dependencies = ( 212 | 48B78BCE1A5E382400B662F7 /* PBXTargetDependency */, 213 | ); 214 | name = XXNibBridgeDemoTests; 215 | productName = XXNibBridgeDemoTests; 216 | productReference = 48B78BCC1A5E382400B662F7 /* XXNibBridgeDemoTests.xctest */; 217 | productType = "com.apple.product-type.bundle.unit-test"; 218 | }; 219 | /* End PBXNativeTarget section */ 220 | 221 | /* Begin PBXProject section */ 222 | 48B78BAB1A5E382400B662F7 /* Project object */ = { 223 | isa = PBXProject; 224 | attributes = { 225 | CLASSPREFIX = XX; 226 | LastUpgradeCheck = 0610; 227 | ORGANIZATIONNAME = sunnyxx; 228 | TargetAttributes = { 229 | 48B78BB21A5E382400B662F7 = { 230 | CreatedOnToolsVersion = 6.1.1; 231 | }; 232 | 48B78BCB1A5E382400B662F7 = { 233 | CreatedOnToolsVersion = 6.1.1; 234 | TestTargetID = 48B78BB21A5E382400B662F7; 235 | }; 236 | }; 237 | }; 238 | buildConfigurationList = 48B78BAE1A5E382400B662F7 /* Build configuration list for PBXProject "XXNibBridgeDemo" */; 239 | compatibilityVersion = "Xcode 3.2"; 240 | developmentRegion = English; 241 | hasScannedForEncodings = 0; 242 | knownRegions = ( 243 | en, 244 | Base, 245 | ); 246 | mainGroup = 48B78BAA1A5E382400B662F7; 247 | productRefGroup = 48B78BB41A5E382400B662F7 /* Products */; 248 | projectDirPath = ""; 249 | projectRoot = ""; 250 | targets = ( 251 | 48B78BB21A5E382400B662F7 /* XXNibBridgeDemo */, 252 | 48B78BCB1A5E382400B662F7 /* XXNibBridgeDemoTests */, 253 | ); 254 | }; 255 | /* End PBXProject section */ 256 | 257 | /* Begin PBXResourcesBuildPhase section */ 258 | 48B78BB11A5E382400B662F7 /* Resources */ = { 259 | isa = PBXResourcesBuildPhase; 260 | buildActionMask = 2147483647; 261 | files = ( 262 | 48B78BC21A5E382400B662F7 /* Main.storyboard in Resources */, 263 | 48B78BEA1A5E6B2700B662F7 /* XXDogeView.xib in Resources */, 264 | 48B78BC71A5E382400B662F7 /* LaunchScreen.xib in Resources */, 265 | 48B78BC41A5E382400B662F7 /* Images.xcassets in Resources */, 266 | 48B78BEC1A5E6B2700B662F7 /* XXSarkView.xib in Resources */, 267 | 488DAAFE1B95BA2A00680E56 /* XXConvensionCell.xib in Resources */, 268 | ); 269 | runOnlyForDeploymentPostprocessing = 0; 270 | }; 271 | 48B78BCA1A5E382400B662F7 /* Resources */ = { 272 | isa = PBXResourcesBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | ); 276 | runOnlyForDeploymentPostprocessing = 0; 277 | }; 278 | /* End PBXResourcesBuildPhase section */ 279 | 280 | /* Begin PBXSourcesBuildPhase section */ 281 | 48B78BAF1A5E382400B662F7 /* Sources */ = { 282 | isa = PBXSourcesBuildPhase; 283 | buildActionMask = 2147483647; 284 | files = ( 285 | 48B78BDF1A5E38AF00B662F7 /* XXNibBridge.m in Sources */, 286 | 48B78BE91A5E6B2700B662F7 /* XXDogeView.m in Sources */, 287 | 48B78BEB1A5E6B2700B662F7 /* XXSarkView.m in Sources */, 288 | 488DAAFD1B95BA2A00680E56 /* XXConvensionCell.m in Sources */, 289 | 48ADAFEE1A5FD274008F2ED8 /* XXNibConvention.m in Sources */, 290 | 488DAB011B95BA4400680E56 /* XXMainViewController.m in Sources */, 291 | 48B78BE81A5E6B2700B662F7 /* XXAppDelegate.m in Sources */, 292 | 48B78BB91A5E382400B662F7 /* main.m in Sources */, 293 | ); 294 | runOnlyForDeploymentPostprocessing = 0; 295 | }; 296 | 48B78BC81A5E382400B662F7 /* Sources */ = { 297 | isa = PBXSourcesBuildPhase; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | 48B78BD31A5E382400B662F7 /* XXNibBridgeDemoTests.m in Sources */, 301 | ); 302 | runOnlyForDeploymentPostprocessing = 0; 303 | }; 304 | /* End PBXSourcesBuildPhase section */ 305 | 306 | /* Begin PBXTargetDependency section */ 307 | 48B78BCE1A5E382400B662F7 /* PBXTargetDependency */ = { 308 | isa = PBXTargetDependency; 309 | target = 48B78BB21A5E382400B662F7 /* XXNibBridgeDemo */; 310 | targetProxy = 48B78BCD1A5E382400B662F7 /* PBXContainerItemProxy */; 311 | }; 312 | /* End PBXTargetDependency section */ 313 | 314 | /* Begin PBXVariantGroup section */ 315 | 48B78BC01A5E382400B662F7 /* Main.storyboard */ = { 316 | isa = PBXVariantGroup; 317 | children = ( 318 | 48B78BC11A5E382400B662F7 /* Base */, 319 | ); 320 | name = Main.storyboard; 321 | sourceTree = ""; 322 | }; 323 | 48B78BC51A5E382400B662F7 /* LaunchScreen.xib */ = { 324 | isa = PBXVariantGroup; 325 | children = ( 326 | 48B78BC61A5E382400B662F7 /* Base */, 327 | ); 328 | name = LaunchScreen.xib; 329 | sourceTree = ""; 330 | }; 331 | /* End PBXVariantGroup section */ 332 | 333 | /* Begin XCBuildConfiguration section */ 334 | 48B78BD41A5E382400B662F7 /* Debug */ = { 335 | isa = XCBuildConfiguration; 336 | buildSettings = { 337 | ALWAYS_SEARCH_USER_PATHS = NO; 338 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 339 | CLANG_CXX_LIBRARY = "libc++"; 340 | CLANG_ENABLE_MODULES = YES; 341 | CLANG_ENABLE_OBJC_ARC = YES; 342 | CLANG_WARN_BOOL_CONVERSION = YES; 343 | CLANG_WARN_CONSTANT_CONVERSION = YES; 344 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 345 | CLANG_WARN_EMPTY_BODY = YES; 346 | CLANG_WARN_ENUM_CONVERSION = YES; 347 | CLANG_WARN_INT_CONVERSION = YES; 348 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 349 | CLANG_WARN_UNREACHABLE_CODE = YES; 350 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 351 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 352 | COPY_PHASE_STRIP = NO; 353 | ENABLE_STRICT_OBJC_MSGSEND = YES; 354 | GCC_C_LANGUAGE_STANDARD = gnu99; 355 | GCC_DYNAMIC_NO_PIC = NO; 356 | GCC_OPTIMIZATION_LEVEL = 0; 357 | GCC_PREPROCESSOR_DEFINITIONS = ( 358 | "DEBUG=1", 359 | "$(inherited)", 360 | ); 361 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 362 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 363 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 364 | GCC_WARN_UNDECLARED_SELECTOR = YES; 365 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 366 | GCC_WARN_UNUSED_FUNCTION = YES; 367 | GCC_WARN_UNUSED_VARIABLE = YES; 368 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 369 | MTL_ENABLE_DEBUG_INFO = YES; 370 | ONLY_ACTIVE_ARCH = YES; 371 | SDKROOT = iphoneos; 372 | }; 373 | name = Debug; 374 | }; 375 | 48B78BD51A5E382400B662F7 /* Release */ = { 376 | isa = XCBuildConfiguration; 377 | buildSettings = { 378 | ALWAYS_SEARCH_USER_PATHS = NO; 379 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 380 | CLANG_CXX_LIBRARY = "libc++"; 381 | CLANG_ENABLE_MODULES = YES; 382 | CLANG_ENABLE_OBJC_ARC = YES; 383 | CLANG_WARN_BOOL_CONVERSION = YES; 384 | CLANG_WARN_CONSTANT_CONVERSION = YES; 385 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 386 | CLANG_WARN_EMPTY_BODY = YES; 387 | CLANG_WARN_ENUM_CONVERSION = YES; 388 | CLANG_WARN_INT_CONVERSION = YES; 389 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 390 | CLANG_WARN_UNREACHABLE_CODE = YES; 391 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 392 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 393 | COPY_PHASE_STRIP = YES; 394 | ENABLE_NS_ASSERTIONS = NO; 395 | ENABLE_STRICT_OBJC_MSGSEND = YES; 396 | GCC_C_LANGUAGE_STANDARD = gnu99; 397 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 398 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 399 | GCC_WARN_UNDECLARED_SELECTOR = YES; 400 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 401 | GCC_WARN_UNUSED_FUNCTION = YES; 402 | GCC_WARN_UNUSED_VARIABLE = YES; 403 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 404 | MTL_ENABLE_DEBUG_INFO = NO; 405 | SDKROOT = iphoneos; 406 | VALIDATE_PRODUCT = YES; 407 | }; 408 | name = Release; 409 | }; 410 | 48B78BD71A5E382400B662F7 /* Debug */ = { 411 | isa = XCBuildConfiguration; 412 | buildSettings = { 413 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 414 | INFOPLIST_FILE = XXNibBridgeDemo/Info.plist; 415 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 416 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 417 | PRODUCT_NAME = "$(TARGET_NAME)"; 418 | }; 419 | name = Debug; 420 | }; 421 | 48B78BD81A5E382400B662F7 /* Release */ = { 422 | isa = XCBuildConfiguration; 423 | buildSettings = { 424 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 425 | INFOPLIST_FILE = XXNibBridgeDemo/Info.plist; 426 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 427 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 428 | PRODUCT_NAME = "$(TARGET_NAME)"; 429 | }; 430 | name = Release; 431 | }; 432 | 48B78BDA1A5E382400B662F7 /* Debug */ = { 433 | isa = XCBuildConfiguration; 434 | buildSettings = { 435 | BUNDLE_LOADER = "$(TEST_HOST)"; 436 | FRAMEWORK_SEARCH_PATHS = ( 437 | "$(SDKROOT)/Developer/Library/Frameworks", 438 | "$(inherited)", 439 | ); 440 | GCC_PREPROCESSOR_DEFINITIONS = ( 441 | "DEBUG=1", 442 | "$(inherited)", 443 | ); 444 | INFOPLIST_FILE = XXNibBridgeDemoTests/Info.plist; 445 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 446 | PRODUCT_NAME = "$(TARGET_NAME)"; 447 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/XXNibBridgeDemo.app/XXNibBridgeDemo"; 448 | }; 449 | name = Debug; 450 | }; 451 | 48B78BDB1A5E382400B662F7 /* Release */ = { 452 | isa = XCBuildConfiguration; 453 | buildSettings = { 454 | BUNDLE_LOADER = "$(TEST_HOST)"; 455 | FRAMEWORK_SEARCH_PATHS = ( 456 | "$(SDKROOT)/Developer/Library/Frameworks", 457 | "$(inherited)", 458 | ); 459 | INFOPLIST_FILE = XXNibBridgeDemoTests/Info.plist; 460 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 461 | PRODUCT_NAME = "$(TARGET_NAME)"; 462 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/XXNibBridgeDemo.app/XXNibBridgeDemo"; 463 | }; 464 | name = Release; 465 | }; 466 | /* End XCBuildConfiguration section */ 467 | 468 | /* Begin XCConfigurationList section */ 469 | 48B78BAE1A5E382400B662F7 /* Build configuration list for PBXProject "XXNibBridgeDemo" */ = { 470 | isa = XCConfigurationList; 471 | buildConfigurations = ( 472 | 48B78BD41A5E382400B662F7 /* Debug */, 473 | 48B78BD51A5E382400B662F7 /* Release */, 474 | ); 475 | defaultConfigurationIsVisible = 0; 476 | defaultConfigurationName = Release; 477 | }; 478 | 48B78BD61A5E382400B662F7 /* Build configuration list for PBXNativeTarget "XXNibBridgeDemo" */ = { 479 | isa = XCConfigurationList; 480 | buildConfigurations = ( 481 | 48B78BD71A5E382400B662F7 /* Debug */, 482 | 48B78BD81A5E382400B662F7 /* Release */, 483 | ); 484 | defaultConfigurationIsVisible = 0; 485 | defaultConfigurationName = Release; 486 | }; 487 | 48B78BD91A5E382400B662F7 /* Build configuration list for PBXNativeTarget "XXNibBridgeDemoTests" */ = { 488 | isa = XCConfigurationList; 489 | buildConfigurations = ( 490 | 48B78BDA1A5E382400B662F7 /* Debug */, 491 | 48B78BDB1A5E382400B662F7 /* Release */, 492 | ); 493 | defaultConfigurationIsVisible = 0; 494 | defaultConfigurationName = Release; 495 | }; 496 | /* End XCConfigurationList section */ 497 | }; 498 | rootObject = 48B78BAB1A5E382400B662F7 /* Project object */; 499 | } 500 | --------------------------------------------------------------------------------