├── SuggestionsBox ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── Comment.swift │ ├── Suggestion.swift │ ├── NewCommentController.swift │ ├── NewSuggestionController.swift │ ├── DetailController.swift │ └── SuggestionsBox.swift ├── _Pods.xcodeproj ├── Images ├── archive.psd ├── Screenshots.psd ├── SuggestionsBox.gif └── SuggestionsBox.psd ├── Example ├── Pods │ ├── Target Support Files │ │ ├── SuggestionsBox │ │ │ ├── SuggestionsBox-prefix.pch │ │ │ ├── SuggestionsBox.modulemap │ │ │ ├── SuggestionsBox-dummy.m │ │ │ ├── SuggestionsBox-umbrella.h │ │ │ ├── SuggestionsBox.xcconfig │ │ │ └── Info.plist │ │ ├── Pods-SuggestionsBox_Tests │ │ │ ├── Pods-SuggestionsBox_Tests-acknowledgements.markdown │ │ │ ├── Pods-SuggestionsBox_Tests.modulemap │ │ │ ├── Pods-SuggestionsBox_Tests-dummy.m │ │ │ ├── Pods-SuggestionsBox_Tests-umbrella.h │ │ │ ├── Pods-SuggestionsBox_Tests.debug.xcconfig │ │ │ ├── Pods-SuggestionsBox_Tests.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-SuggestionsBox_Tests-acknowledgements.plist │ │ │ ├── Pods-SuggestionsBox_Tests-frameworks.sh │ │ │ └── Pods-SuggestionsBox_Tests-resources.sh │ │ └── Pods-SuggestionsBox_Example │ │ │ ├── Pods-SuggestionsBox_Example.modulemap │ │ │ ├── Pods-SuggestionsBox_Example-dummy.m │ │ │ ├── Pods-SuggestionsBox_Example-umbrella.h │ │ │ ├── Pods-SuggestionsBox_Example.debug.xcconfig │ │ │ ├── Pods-SuggestionsBox_Example.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-SuggestionsBox_Example-acknowledgements.markdown │ │ │ ├── Pods-SuggestionsBox_Example-acknowledgements.plist │ │ │ ├── Pods-SuggestionsBox_Example-frameworks.sh │ │ │ └── Pods-SuggestionsBox_Example-resources.sh │ ├── Manifest.lock │ ├── Local Podspecs │ │ └── SuggestionsBox.podspec.json │ └── Pods.xcodeproj │ │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── SuggestionsBox.xcscheme │ │ └── project.pbxproj ├── SuggestionsBox │ ├── Images.xcassets │ │ ├── Contents.json │ │ ├── Image.imageset │ │ │ ├── archive.png │ │ │ ├── archive (1).png │ │ │ └── Contents.json │ │ ├── IconQuestions.imageset │ │ │ ├── Icon.png │ │ │ ├── Icon2.png │ │ │ └── Contents.json │ │ ├── ImageGray.imageset │ │ │ ├── archive.png │ │ │ ├── archive-(1).png │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.xib │ └── ViewController.swift ├── Podfile ├── SuggestionsBox.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── SuggestionsBox-Example.xcscheme │ └── project.pbxproj ├── SuggestionsBox.xcworkspace │ └── contents.xcworkspacedata ├── Podfile.lock └── Tests │ ├── Info.plist │ └── Tests.swift ├── .travis.yml ├── .gitignore ├── LICENSE ├── SuggestionsBox.podspec └── README.md /SuggestionsBox/Assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /SuggestionsBox/Classes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /Images/archive.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Images/archive.psd -------------------------------------------------------------------------------- /Images/Screenshots.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Images/Screenshots.psd -------------------------------------------------------------------------------- /Images/SuggestionsBox.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Images/SuggestionsBox.gif -------------------------------------------------------------------------------- /Images/SuggestionsBox.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Images/SuggestionsBox.psd -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SuggestionsBox/SuggestionsBox-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/Image.imageset/archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Example/SuggestionsBox/Images.xcassets/Image.imageset/archive.png -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/IconQuestions.imageset/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Example/SuggestionsBox/Images.xcassets/IconQuestions.imageset/Icon.png -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/Image.imageset/archive (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Example/SuggestionsBox/Images.xcassets/Image.imageset/archive (1).png -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/ImageGray.imageset/archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Example/SuggestionsBox/Images.xcassets/ImageGray.imageset/archive.png -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/IconQuestions.imageset/Icon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Example/SuggestionsBox/Images.xcassets/IconQuestions.imageset/Icon2.png -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/ImageGray.imageset/archive-(1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manuelescrig/SuggestionsBox/HEAD/Example/SuggestionsBox/Images.xcassets/ImageGray.imageset/archive-(1).png -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SuggestionsBox/SuggestionsBox.modulemap: -------------------------------------------------------------------------------- 1 | framework module SuggestionsBox { 2 | umbrella header "SuggestionsBox-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SuggestionsBox/SuggestionsBox-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SuggestionsBox : NSObject 3 | @end 4 | @implementation PodsDummy_SuggestionsBox 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'SuggestionsBox_Example' do 4 | pod 'SuggestionsBox', :path => '../' 5 | 6 | target 'SuggestionsBox_Tests' do 7 | inherit! :search_paths 8 | 9 | 10 | end 11 | end 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SuggestionsBox/SuggestionsBox-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double SuggestionsBoxVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char SuggestionsBoxVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_SuggestionsBox_Tests { 2 | umbrella header "Pods-SuggestionsBox_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_SuggestionsBox_Example { 2 | umbrella header "Pods-SuggestionsBox_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_SuggestionsBox_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_SuggestionsBox_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/SuggestionsBox.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_SuggestionsBox_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_SuggestionsBox_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_SuggestionsBox_TestsVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_SuggestionsBox_TestsVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_SuggestionsBox_ExampleVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_SuggestionsBox_ExampleVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Example/SuggestionsBox.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SuggestionsBox (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - SuggestionsBox (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | SuggestionsBox: 9 | :path: ../ 10 | 11 | SPEC CHECKSUMS: 12 | SuggestionsBox: 823c0404791fd37d5dddd998a167deb3dd085e01 13 | 14 | PODFILE CHECKSUM: 79bd6933df0fc7a5db6ddd5bd7db736a5187c872 15 | 16 | COCOAPODS: 1.0.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SuggestionsBox (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - SuggestionsBox (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | SuggestionsBox: 9 | :path: ../ 10 | 11 | SPEC CHECKSUMS: 12 | SuggestionsBox: 823c0404791fd37d5dddd998a167deb3dd085e01 13 | 14 | PODFILE CHECKSUM: 79bd6933df0fc7a5db6ddd5bd7db736a5187c872 15 | 16 | COCOAPODS: 1.0.1 17 | -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/IconQuestions.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Icon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Icon2.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "archive.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "archive (1).png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Example/SuggestionsBox/Images.xcassets/ImageGray.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "archive.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "archive-(1).png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode8 3 | xcode_workspace: Example/SuggestionsBox.xcworkspace #3 4 | xcode_scheme: SuggestionsBox-Example #4 5 | xcode_sdk: iphonesimulator10.0 #5 6 | 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | # - pod lib lint 14 | - xcodebuild clean build test -project Example/SuggestionsBox.xcworkspace -scheme SuggestionsBox-Example 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SuggestionsBox/SuggestionsBox.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SuggestionsBox 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SuggestionsBox" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/SuggestionsBox/SuggestionsBox.framework/Headers" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT}/Pods 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SuggestionsBox" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/SuggestionsBox/SuggestionsBox.framework/Headers" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT}/Pods 8 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/SuggestionsBox.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SuggestionsBox", 3 | "version": "0.1.0", 4 | "summary": "A short description of SuggestionsBox.", 5 | "description": "TODO: Add long description of the pod here.", 6 | "homepage": "https://github.com//SuggestionsBox", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "Manuel Escrig Ventura": "manuel.escrig@ecrome.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com//SuggestionsBox.git", 16 | "tag": "0.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "8.0" 20 | }, 21 | "source_files": "SuggestionsBox/Classes/**/*" 22 | } 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | Carthage 26 | # We recommend against adding the Pods directory to your .gitignore. However 27 | # you should judge for yourself, the pros and cons are mentioned at: 28 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 29 | # 30 | # Note: if you ignore the Pods directory, make sure to uncomment 31 | # `pod install` in .travis.yml 32 | # 33 | # Pods/ 34 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SuggestionsBox" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/SuggestionsBox/SuggestionsBox.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "SuggestionsBox" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = $BUILD_DIR 9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SuggestionsBox" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/SuggestionsBox/SuggestionsBox.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "SuggestionsBox" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = $BUILD_DIR 9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | -------------------------------------------------------------------------------- /Example/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 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 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import XCTest 3 | import SuggestionsBox 4 | 5 | class Tests: XCTestCase { 6 | 7 | override func setUp() { 8 | super.setUp() 9 | // Put setup code here. This method is called before the invocation of each test method in the class. 10 | } 11 | 12 | override func tearDown() { 13 | // Put teardown code here. This method is called after the invocation of each test method in the class. 14 | super.tearDown() 15 | } 16 | 17 | func testExample() { 18 | // This is an example of a functional test case. 19 | XCTAssert(true, "Pass") 20 | } 21 | 22 | func testPerformanceExample() { 23 | // This is an example of a performance test case. 24 | self.measure() { 25 | // Put the code you want to measure the time of here. 26 | } 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/SuggestionsBox/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.2.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.2.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.2.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Manuel Escrig Ventura 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/SuggestionsBox/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.2.3 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 | 38 | UIViewControllerBasedStatusBarAppearance 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## SuggestionsBox 5 | 6 | Copyright (c) 2016 Manuel Escrig Ventura 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /SuggestionsBox.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint SuggestionsBox.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'SuggestionsBox' 11 | s.version = '1.5' 12 | s.summary = 'SuggestionsBox helps you build better a product trough your user suggestions.' 13 | s.description = <<-DESC 14 | An iOS library to aggregate users feedback about suggestions, features or comments in order to help you build a better product. 15 | DESC 16 | s.homepage = 'https://github.com/manuelescrig/SuggestionsBox' 17 | s.screenshots = 'https://cloud.githubusercontent.com/assets/1849990/15703910/2b646d9c-27e8-11e6-889c-0eee15ede7e3.jpg' 18 | s.license = { :type => 'MIT', :file => 'LICENSE' } 19 | s.author = { 'Manuel Escrig Ventura' => 'manuelescrig@gmail.com' } 20 | s.source = { :git => 'https://github.com/manuelescrig/SuggestionsBox.git', :tag => s.version.to_s } 21 | s.social_media_url = 'https://twitter.com/manuelescrig' 22 | s.ios.deployment_target = '8.0' 23 | s.source_files = 'SuggestionsBox/Classes/**/*' 24 | 25 | # s.resource_bundles = { 26 | # 'SuggestionsBox' => ['SuggestionsBox/Assets/*.png'] 27 | # } 28 | # s.public_header_files = 'Pod/Classes/**/*.h' 29 | # s.frameworks = 'UIKit', 'MapKit' 30 | end 31 | -------------------------------------------------------------------------------- /Example/SuggestionsBox/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" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "83.5x83.5", 66 | "scale" : "2x" 67 | } 68 | ], 69 | "info" : { 70 | "version" : 1, 71 | "author" : "xcode" 72 | } 73 | } -------------------------------------------------------------------------------- /SuggestionsBox/Classes/Comment.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Comment.swift 3 | // SuggestionsBox 4 | // An iOS library to aggregate users feedback about suggestions, 5 | // features or comments in order to help you build a better product. 6 | // 7 | // https://github.com/manuelescrig/SuggestionsBox 8 | // 9 | // Created by Manuel Escrig Ventura on 30/04/16. 10 | // Licence: MIT-Licence 11 | 12 | /** 13 | * Comment public class that represents the model for comments for each suggestion. 14 | */ 15 | open class Comment { 16 | 17 | /// An string representing the ID of the suggestion. 18 | open var suggestionId: String 19 | 20 | /// An string representing the ID of the comment. 21 | open var commentId: String 22 | 23 | /// An string representing the description of the comment describing what is about with more details. 24 | open var description: String 25 | 26 | /// An string representing the user that requested/created the comment. 27 | open var user: String 28 | 29 | /// A date representing the date when the suggestion was created. 30 | open var createdAt: Date 31 | 32 | /// Class initializer. 33 | public init(suggestionId: String, 34 | commentId: String, 35 | description: String, 36 | user: String, 37 | createdAt: Date) { 38 | 39 | self.suggestionId = suggestionId 40 | self.commentId = commentId 41 | self.description = description 42 | self.user = user 43 | self.createdAt = createdAt 44 | } 45 | 46 | open func dateString() -> String { 47 | let format = SuggestionsBoxTheme.detailDateFormat 48 | let dateFormatter = DateFormatter() 49 | dateFormatter.dateFormat = format 50 | return dateFormatter.string(from: createdAt) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2016 Manuel Escrig Ventura <manuel.escrig@ecrome.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | Title 38 | SuggestionsBox 39 | Type 40 | PSGroupSpecifier 41 | 42 | 43 | FooterText 44 | Generated by CocoaPods - https://cocoapods.org 45 | Title 46 | 47 | Type 48 | PSGroupSpecifier 49 | 50 | 51 | StringsTable 52 | Acknowledgements 53 | Title 54 | Acknowledgements 55 | 56 | 57 | -------------------------------------------------------------------------------- /SuggestionsBox/Classes/Suggestion.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Suggestion.swift 3 | // SuggestionsBox 4 | // An iOS library to aggregate users feedback about suggestions, 5 | // features or comments in order to help you build a better product. 6 | // 7 | // https://github.com/manuelescrig/SuggestionsBox 8 | // 9 | // Created by Manuel Escrig Ventura on 30/04/16. 10 | // Licence: MIT-Licence 11 | 12 | 13 | /** 14 | * Suggestion public class that represents the suggestion/feature-request model. 15 | */ 16 | open class Suggestion { 17 | 18 | /// An string representing the ID of the suggestion. 19 | open var suggestionId: String 20 | 21 | /// An string representing the title of the suggestion describing what is about in a line. 22 | open var title: String 23 | 24 | /// An string representing the description of the suggestion describing what is about with more details. 25 | open var description: String 26 | 27 | /// An string representing the user that requested/created the suggestion. 28 | open var user: String 29 | 30 | /// A date representing the date when the suggestion was created. 31 | open var createdAt: Date 32 | 33 | /// An array with the strings of the users that have favorited this suggestion. 34 | open var favorites = [String]() 35 | 36 | /// Class initializer. 37 | public init(suggestionId: String, 38 | title: String, 39 | description: String, 40 | user: String, 41 | favorites: [String], 42 | createdAt: Date) { 43 | 44 | self.suggestionId = suggestionId 45 | self.title = title 46 | self.description = description 47 | self.user = user 48 | self.favorites = favorites 49 | self.createdAt = createdAt 50 | } 51 | 52 | open func dateString() -> String { 53 | let format = SuggestionsBoxTheme.detailDateFormat 54 | let dateFormatter = DateFormatter() 55 | dateFormatter.dateFormat = format 56 | return dateFormatter.string(from: createdAt) 57 | } 58 | 59 | open func favoritesString() -> String { 60 | if favorites.count == 1 { 61 | return String(favorites.count) + " " + SuggestionsBoxTheme.detailFavoriteText 62 | } else { 63 | return String(favorites.count) + " " + SuggestionsBoxTheme.detailFavoritesText 64 | } 65 | } 66 | } 67 | 68 | extension Suggestion: Equatable {} 69 | public func ==(lhs: Suggestion, rhs: Suggestion) -> Bool { 70 | return lhs.suggestionId == rhs.suggestionId && lhs.title == rhs.title 71 | } 72 | -------------------------------------------------------------------------------- /Example/SuggestionsBox/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Example 4 | // 5 | // Created by Manuel Escrig Ventura on 12/05/16. 6 | // Copyright © 2016 Manuel Escrig Ventura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 17 | 18 | UIApplication.shared.statusBarStyle = .lightContent 19 | 20 | UINavigationBar.appearance().shadowImage = UIImage() 21 | UINavigationBar.appearance().barTintColor = UIColor(red:19/255.0, green:100/255.0, blue:155/255.0, alpha: 1.0) 22 | UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.white, 23 | NSFontAttributeName: UIFont(name: "HelveticaNeue-Medium", size: 19)!] 24 | UINavigationBar.appearance().tintColor = UIColor.white 25 | 26 | return true 27 | } 28 | 29 | func applicationWillResignActive(_ application: UIApplication) { 30 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 31 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 32 | } 33 | 34 | func applicationDidEnterBackground(_ application: UIApplication) { 35 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 36 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 37 | } 38 | 39 | func applicationWillEnterForeground(_ application: UIApplication) { 40 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 41 | } 42 | 43 | func applicationDidBecomeActive(_ application: UIApplication) { 44 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 45 | } 46 | 47 | func applicationWillTerminate(_ application: UIApplication) { 48 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 49 | } 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /Example/SuggestionsBox/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 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/SuggestionsBox.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" 63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" 64 | fi 65 | } 66 | 67 | # Strip invalid architectures 68 | strip_invalid_archs() { 69 | binary="$1" 70 | # Get architectures for current file 71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 72 | stripped="" 73 | for arch in $archs; do 74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 75 | # Strip non-valid architectures in-place 76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 77 | stripped="$stripped $arch" 78 | fi 79 | done 80 | if [[ "$stripped" ]]; then 81 | echo "Stripped $binary of architectures:$stripped" 82 | fi 83 | } 84 | 85 | -------------------------------------------------------------------------------- /Example/SuggestionsBox/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" 63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" 64 | fi 65 | } 66 | 67 | # Strip invalid architectures 68 | strip_invalid_archs() { 69 | binary="$1" 70 | # Get architectures for current file 71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 72 | stripped="" 73 | for arch in $archs; do 74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 75 | # Strip non-valid architectures in-place 76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 77 | stripped="$stripped $arch" 78 | fi 79 | done 80 | if [[ "$stripped" ]]; then 81 | echo "Stripped $binary of architectures:$stripped" 82 | fi 83 | } 84 | 85 | 86 | if [[ "$CONFIGURATION" == "Debug" ]]; then 87 | install_framework "$BUILT_PRODUCTS_DIR/SuggestionsBox/SuggestionsBox.framework" 88 | fi 89 | if [[ "$CONFIGURATION" == "Release" ]]; then 90 | install_framework "$BUILT_PRODUCTS_DIR/SuggestionsBox/SuggestionsBox.framework" 91 | fi 92 | -------------------------------------------------------------------------------- /Example/SuggestionsBox.xcodeproj/xcshareddata/xcschemes/SuggestionsBox-Example.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 | 67 | 68 | 78 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 99 | 105 | 106 | 107 | 108 | 110 | 111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /SuggestionsBox/Classes/NewCommentController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NewCommentController.swift 3 | // SuggestionsBox 4 | // An iOS library to aggregate users feedback about suggestions, 5 | // features or comments in order to help you build a better product. 6 | // 7 | // https://github.com/manuelescrig/SuggestionsBox 8 | // 9 | // Created by Manuel Escrig Ventura on 30/04/16. 10 | // Licence: MIT-Licence 11 | 12 | 13 | class NewCommentController: UITableViewController, TextViewCellDelegate { 14 | 15 | weak var delegate: SuggestionsBoxDelegate? 16 | 17 | var commentText = String() 18 | var suggestion: Suggestion? 19 | var footerLabel: UILabel = UILabel.init() 20 | 21 | let cellIdentifier = "TextViewCell" 22 | 23 | // MARK: View Lyfe Cylce 24 | 25 | required convenience init(coder aDecoder: NSCoder) { 26 | self.init(nibName: nil, bundle: nil) 27 | } 28 | 29 | override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: Bundle!) { 30 | super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 31 | } 32 | 33 | override func viewDidLoad() { 34 | super.viewDidLoad() 35 | 36 | // Content View 37 | self.view.backgroundColor = SuggestionsBoxTheme.viewBackgroundColor 38 | 39 | // NavigationBar 40 | self.navigationController!.navigationBar.barTintColor = SuggestionsBoxTheme.navigationBarBackgroundColor 41 | self.navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: SuggestionsBoxTheme.navigationBarTexColor] 42 | self.navigationController!.navigationBar.tintColor = SuggestionsBoxTheme.navigationBarButtonColor 43 | 44 | // Title 45 | self.title = SuggestionsBoxTheme.newCommentTitleText 46 | 47 | // Table View 48 | self.tableView.estimatedRowHeight = 90 49 | self.tableView.rowHeight = UITableViewAutomaticDimension 50 | self.tableView.register(TextViewCell.self, forCellReuseIdentifier: cellIdentifier) 51 | self.tableView.separatorColor = SuggestionsBoxTheme.tableSeparatorColor 52 | self.tableView.backgroundColor = SuggestionsBoxTheme.viewBackgroundColor 53 | self.tableView.tableFooterView = UIView() 54 | 55 | // Footer Label 56 | self.footerLabel.text = SuggestionsBoxTheme.newCommentFooterText 57 | self.footerLabel.textAlignment = .center 58 | self.footerLabel.numberOfLines = 3 59 | self.footerLabel.font = UIFont.systemFont(ofSize: 16) 60 | self.footerLabel.textColor = SuggestionsBoxTheme.viewTextColor 61 | self.footerLabel.frame = CGRect(x: SuggestionsBoxTheme.sizeTableViewHeaderViewPadding, y: 0, width: self.view.frame.size.width - SuggestionsBoxTheme.sizeTableViewHeaderViewPadding * 2, height: SuggestionsBoxTheme.sizeTableViewFooterViewHeight) 62 | self.tableView.tableFooterView = self.footerLabel 63 | 64 | // Button 65 | let saveButton = UIBarButtonItem.init(barButtonSystemItem: .save, target: self, action: #selector(save(_:))) 66 | self.navigationItem.setRightBarButton(saveButton, animated: false) 67 | self.navigationItem.rightBarButtonItem?.isEnabled = false 68 | 69 | let cancelButton = UIBarButtonItem.init(barButtonSystemItem: .cancel, target: self, action: #selector(cancel(_:))) 70 | self.navigationItem.setLeftBarButton(cancelButton, animated: false) 71 | } 72 | 73 | // MARK: UI Actions 74 | 75 | func save(_ sender: UIBarButtonItem) { 76 | 77 | if let delegate = delegate { 78 | let comment = Comment.init(suggestionId: (suggestion?.suggestionId)!, commentId: NewSuggestionController.randomStringWithLength(12), description: commentText, user: SuggestionsBoxTheme.user, createdAt: Date()) 79 | delegate.newCommentForSuggestionAdded(suggestion!, newComment: comment) 80 | } 81 | 82 | self.navigationController!.dismiss(animated: true, completion: nil) 83 | } 84 | 85 | 86 | func cancel(_ sender: UIBarButtonItem) { 87 | self.navigationController!.dismiss(animated: true, completion: nil) 88 | } 89 | 90 | 91 | // MARK: UITableView DataSource 92 | 93 | override func numberOfSections(in tableView: UITableView) -> Int { 94 | return 1 95 | } 96 | 97 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 98 | return 1 99 | } 100 | 101 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 102 | 103 | let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! TextViewCell 104 | cell.delegate = self 105 | cell.parentTableView = self.tableView 106 | cell.selectionStyle = .none 107 | cell.configure("", placeholder: SuggestionsBoxTheme.newCommentCommentPlaceholderText) 108 | 109 | return cell 110 | } 111 | 112 | override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 113 | return SuggestionsBoxTheme.newCommentCommentSectionText 114 | } 115 | 116 | // MARK: TextViewCellDelegate 117 | 118 | func textDidChange(_ sender: TextViewCell) { 119 | 120 | commentText = sender.textView.text 121 | 122 | if commentText.characters.count > 3 { 123 | self.navigationItem.rightBarButtonItem?.isEnabled = true 124 | } else { 125 | self.navigationItem.rightBarButtonItem?.isEnabled = false 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | case "${TARGETED_DEVICE_FAMILY}" in 12 | 1,2) 13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 14 | ;; 15 | 1) 16 | TARGET_DEVICE_ARGS="--target-device iphone" 17 | ;; 18 | 2) 19 | TARGET_DEVICE_ARGS="--target-device ipad" 20 | ;; 21 | *) 22 | TARGET_DEVICE_ARGS="--target-device mac" 23 | ;; 24 | esac 25 | 26 | realpath() { 27 | DIRECTORY="$(cd "${1%/*}" && pwd)" 28 | FILENAME="${1##*/}" 29 | echo "$DIRECTORY/$FILENAME" 30 | } 31 | 32 | install_resource() 33 | { 34 | if [[ "$1" = /* ]] ; then 35 | RESOURCE_PATH="$1" 36 | else 37 | RESOURCE_PATH="${PODS_ROOT}/$1" 38 | fi 39 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 40 | cat << EOM 41 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 42 | EOM 43 | exit 1 44 | fi 45 | case $RESOURCE_PATH in 46 | *.storyboard) 47 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 48 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 49 | ;; 50 | *.xib) 51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.framework) 55 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 57 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 58 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 59 | ;; 60 | *.xcdatamodel) 61 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 62 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 63 | ;; 64 | *.xcdatamodeld) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 67 | ;; 68 | *.xcmappingmodel) 69 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 70 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 71 | ;; 72 | *.xcassets) 73 | ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") 74 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 75 | ;; 76 | *) 77 | echo "$RESOURCE_PATH" 78 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 79 | ;; 80 | esac 81 | } 82 | 83 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 86 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 87 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | fi 89 | rm -f "$RESOURCES_TO_COPY" 90 | 91 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 92 | then 93 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 94 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 95 | while read line; do 96 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 97 | XCASSET_FILES+=("$line") 98 | fi 99 | done <<<"$OTHER_XCASSETS" 100 | 101 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 102 | fi 103 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | case "${TARGETED_DEVICE_FAMILY}" in 12 | 1,2) 13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 14 | ;; 15 | 1) 16 | TARGET_DEVICE_ARGS="--target-device iphone" 17 | ;; 18 | 2) 19 | TARGET_DEVICE_ARGS="--target-device ipad" 20 | ;; 21 | *) 22 | TARGET_DEVICE_ARGS="--target-device mac" 23 | ;; 24 | esac 25 | 26 | realpath() { 27 | DIRECTORY="$(cd "${1%/*}" && pwd)" 28 | FILENAME="${1##*/}" 29 | echo "$DIRECTORY/$FILENAME" 30 | } 31 | 32 | install_resource() 33 | { 34 | if [[ "$1" = /* ]] ; then 35 | RESOURCE_PATH="$1" 36 | else 37 | RESOURCE_PATH="${PODS_ROOT}/$1" 38 | fi 39 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 40 | cat << EOM 41 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 42 | EOM 43 | exit 1 44 | fi 45 | case $RESOURCE_PATH in 46 | *.storyboard) 47 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 48 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 49 | ;; 50 | *.xib) 51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.framework) 55 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 57 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 58 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 59 | ;; 60 | *.xcdatamodel) 61 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 62 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 63 | ;; 64 | *.xcdatamodeld) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 67 | ;; 68 | *.xcmappingmodel) 69 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 70 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 71 | ;; 72 | *.xcassets) 73 | ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") 74 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 75 | ;; 76 | *) 77 | echo "$RESOURCE_PATH" 78 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 79 | ;; 80 | esac 81 | } 82 | 83 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 86 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 87 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | fi 89 | rm -f "$RESOURCES_TO_COPY" 90 | 91 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 92 | then 93 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 94 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 95 | while read line; do 96 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 97 | XCASSET_FILES+=("$line") 98 | fi 99 | done <<<"$OTHER_XCASSETS" 100 | 101 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 102 | fi 103 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | # SuggestionsBox 4 | [![BuddyBuild](https://dashboard.buddybuild.com/api/statusImage?appID=58933102c8fcc401007586b8&branch=master&build=latest)](https://dashboard.buddybuild.com/apps/58933102c8fcc401007586b8/build/latest?branch=master) 5 | [![Version](https://img.shields.io/cocoapods/v/SuggestionsBox.svg?style=flat)](http://cocoapods.org/pods/SuggestionsBox) 6 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 7 | [![License](https://img.shields.io/cocoapods/l/SuggestionsBox.svg?style=flat)](http://cocoapods.org/pods/SuggestionsBox) 8 | [![Platform](https://img.shields.io/cocoapods/p/SuggestionsBox.svg?style=flat)](http://cocoapods.org/pods/SuggestionsBox) 9 | [![Language](https://img.shields.io/badge/language-swift-oragne.svg?style=flat)](https://developer.apple.com/swift) 10 | 11 | An **iOS library** to aggregate **users feedback** about suggestions, features or comments in order to help you build a **better product**. 12 | 13 | #### Swift Versions 14 | - [Version 1.5 is compatible with Swift 3](https://github.com/manuelescrig/SuggestionsBox/releases/tag/1.5) 15 | - [Version 1.2.6 is compatible Swift 2.2](https://github.com/manuelescrig/SuggestionsBox/releases/tag/1.2.6) 16 | 17 | ## Why SuggestionsBox? 18 | - [x] Aggregates customer feedback 19 | - [x] Let your customer decide 20 | - [x] Build the most voted suggestion 21 | - [x] Build a better product 22 | 23 | ## Features 24 | - [x] List and add new suggestions 25 | - [x] Comment and vote other suggestions 26 | - [x] Search inside Titles and Descriptions 27 | - [x] Customizable colors and strings 28 | - [x] Localizable 29 | 30 |

31 | 32 | ## Demo App 33 | 34 | Run the demo app and play with it! 35 | [Demo App](https://appetize.io/app/6e14g9b61qd10dh4jq698vz44m?device=iphone6splus&scale=50&orientation=portrait&osVersion=9.3&deviceColor=white) 36 | 37 | ## Demo Project 38 | 39 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 40 | 41 | ## Getting Started 42 | 43 | ### Requirements 44 | 45 | Requires iOS SDK version > 8.0 46 | 47 | Requires Swift 3.0 48 | 49 | ### Installation with CocoaPods 50 | 51 | [CocoaPods](cocoapods.org) is a 3rd-party dependency manager for Swift and Objective-C projects. For more information, refer to the [CocoaPods Getting Started Guide](https://guides.cocoapods.org/using/getting-started.html). Otherwise, you can install CocoaPods with the following command: 52 | 53 | ```bash 54 | $ gem install cocoapods 55 | ``` 56 | 57 | #### Podfile 58 | To integrate MEVHorizontalContacts into your Xcode project using CocoaPods, specify it in your `Podfile`: 59 | 60 | ```ruby 61 | source 'https://github.com/CocoaPods/Specs.git' 62 | pod 'SuggestionsBox' 63 | ``` 64 | 65 | Then, run the following command: 66 | 67 | ```bash 68 | $ pod install 69 | ``` 70 | 71 | ### Installation Manually 72 | To integrate SuggestionsBox into your Xcode project manually, just include the filest from [/Pod/Classes/](https://github.com/manuelescrig/MEVHorizontalContacts/tree/master/SuggestionsBox/Classes) folder in your App’s Xcode project. 73 | 74 | Then, import the following file your classes: 75 | ```swift 76 | import SuggestionsBox 77 | ``` 78 | 79 | ## Quick Guide 80 | 81 | ### Usage 82 | 83 | ###### 1. Import class 84 | 85 | ```swift 86 | import SuggestionsBox 87 | ``` 88 | 89 | ###### 2. Add Delegate protocol. 90 | 91 | ```swift 92 | class ViewController: UIViewController, SuggestionsBoxDelegate { 93 | } 94 | ``` 95 | 96 | ###### 3. Create, initialize and add SuggestionsBox. 97 | 98 | ```swift 99 | let suggestionsBox = SuggestionsBox() 100 | suggestionsBox.delegate = self 101 | SuggestionsBoxTheme.user = "Manuel" 102 | SuggestionsBoxTheme.appName = "SuggestionsBox" 103 | SuggestionsBoxTheme.title = "SuggestionsBox" 104 | SuggestionsBoxTheme.headerText = "Suggest a new feature, tweak, improvement... We'd love to hear your sugestions!" 105 | SuggestionsBoxTheme.footerText = "Powered by SuggestionsBox" 106 | SuggestionsBoxTheme.newSuggestionFooterText = "Powered by SuggestionsBox" 107 | SuggestionsBoxTheme.newCommentFooterText = "Powered by SuggestionsBox" 108 | SuggestionsBoxTheme.navigationBarHeartColor = UIColor.redColor() 109 | SuggestionsBoxTheme.tableSeparatorColor = UIColor.groupTableViewBackgroundColor() 110 | SuggestionsBoxTheme.tableCellBackgroundColor = UIColor.whiteColor() 111 | SuggestionsBoxTheme.tableCellTitleTextColor = UIColor.blackColor() 112 | SuggestionsBoxTheme.tableCellDescriptionTextColor = UIColor.lightGrayColor() 113 | 114 | let navigationBar = UINavigationController.init(rootViewController: suggestionsBox) 115 | self.presentViewController(navigationBar, animated: true, completion: nil) 116 | 117 | ``` 118 | 119 | ###### 4. Implement Delegate Methods 120 | 121 | ```swift 122 | // MARK : SuggestionsBoxDelegate Methods 123 | 124 | func suggestions() -> Array { 125 | return self.featureRequests 126 | } 127 | 128 | func commentsForSuggestion(suggestion: Suggestion) -> Array { 129 | return self.comments.filter({ $0.suggestionId == suggestion.suggestionId }) 130 | } 131 | 132 | func newSuggestionAdded(newSuggestion: Suggestion) { 133 | // Refresh online data 134 | self.featureRequests.append(newSuggestion) 135 | } 136 | 137 | func newCommentForSuggestionAdded(suggestion: Suggestion, newComment: Comment) { 138 | // Refresh online data 139 | self.comments.append(newComment) 140 | } 141 | 142 | func suggestionFavorited(suggestion: Suggestion) { 143 | // Refresh online data 144 | 145 | // Refresh local data 146 | let index = self.featureRequests.indexOf(suggestion) 147 | self.featureRequests[index!] = suggestion 148 | } 149 | 150 | func suggestionUnFavorited(suggestion: Suggestion) { 151 | // Refresh online data 152 | 153 | // Refresh local data 154 | let index = self.featureRequests.indexOf(suggestion) 155 | self.featureRequests[index!] = suggestion 156 | } 157 | 158 | ``` 159 | 160 | ## Roadmap 161 | - [x] CocoaPods support 162 | - [x] Carthage support 163 | - [ ] Tests 164 | 165 | 166 | ## Apps using this library 167 | 168 | - [People Tracker App](http://itunes.apple.com/us/app/people-tracker-pro/id539205975?ls=1&mt=8), [www.peopletrackerapp.com](http://www.peopletrackerapp.com) 169 | 170 | 171 | ## Author 172 | 173 | - Created and maintained by Manuel Escrig Ventura, [@manuelescrig](https://www.twitter.com/manuelescrig/) 174 | - Email [manuel@ventura.media](mailto:manuel@ventura.media) 175 | - Portfolio [http://ventura.media](http://ventura.media) 176 | 177 | ## License 178 | 179 | SuggestionsBox is available under the MIT license. See the [LICENSE.md](https://github.com/manuelescrig/SuggestionsBox/blob/master/LICENSE.md) file for more info. 180 | -------------------------------------------------------------------------------- /Example/SuggestionsBox/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Example 4 | // 5 | // Created by Manuel Escrig Ventura on 12/05/16. 6 | // Copyright © 2016 Manuel Escrig Ventura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SuggestionsBox 11 | 12 | class ViewController: UIViewController, SuggestionsBoxDelegate { 13 | 14 | 15 | var label: UILabel = UILabel.init() 16 | var imageView: UIImageView = UIImageView.init() 17 | var featureRequests = [Suggestion]() 18 | var comments = [Comment]() 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | // Title 24 | self.title = "SuggestionsBox" 25 | 26 | // Label 27 | label.frame = CGRect(x: 0, y: 0, width: 300, height: 300) 28 | label.numberOfLines = 0 29 | label.textAlignment = NSTextAlignment.center 30 | label.textColor = UIColor.lightGray 31 | label.font = UIFont.systemFont(ofSize: 20) 32 | label.text = "SuggestionsBox helps your build better a product trough your user suggestions." 33 | self.view.addSubview(label) 34 | 35 | // Image 36 | imageView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) 37 | imageView.alpha = 0.5 38 | imageView.image = UIImage(named:"ImageGray") 39 | self.view.addSubview(imageView) 40 | 41 | // Bar buttons 42 | let questionIcon = UIBarButtonItem(image: UIImage(named:"IconQuestions"), style: .plain, target: self, action: #selector(rightBarButtonItemClicked)) 43 | self.navigationItem.setRightBarButton(questionIcon, animated: true) 44 | 45 | self.getDummyData() 46 | } 47 | 48 | // MARK: StatusBar 49 | 50 | override var preferredStatusBarStyle : UIStatusBarStyle { 51 | return UIStatusBarStyle.lightContent 52 | } 53 | 54 | 55 | // MARK: Layout Methods 56 | 57 | override func viewWillLayoutSubviews() { 58 | super.viewWillLayoutSubviews() 59 | 60 | // Center Point 61 | let center = self.view.center 62 | self.label.center = CGPoint(x: center.x, y: center.y + 60) 63 | self.imageView.center = CGPoint(x: center.x, y: center.y - 70) 64 | } 65 | 66 | 67 | // MARK: UI Actions 68 | 69 | func rightBarButtonItemClicked(_ sender: UIBarButtonItem) { 70 | 71 | let suggestionsBox = SuggestionsBox() 72 | suggestionsBox.delegate = self 73 | SuggestionsBoxTheme.user = "Manuel" 74 | SuggestionsBoxTheme.appName = "SuggestionsBox" 75 | SuggestionsBoxTheme.title = "SuggestionsBox" 76 | SuggestionsBoxTheme.headerText = "Suggest a new feature, tweak, improvement... We'd love to hear your sugestions!" 77 | SuggestionsBoxTheme.footerText = "Powered by SuggestionsBox" 78 | SuggestionsBoxTheme.newSuggestionFooterText = "Powered by SuggestionsBox" 79 | SuggestionsBoxTheme.newCommentFooterText = "Powered by SuggestionsBox" 80 | SuggestionsBoxTheme.navigationBarHeartColor = UIColor.red 81 | SuggestionsBoxTheme.tableSeparatorColor = UIColor.groupTableViewBackground 82 | SuggestionsBoxTheme.tableCellBackgroundColor = UIColor.white 83 | SuggestionsBoxTheme.tableCellTitleTextColor = UIColor.black 84 | SuggestionsBoxTheme.tableCellDescriptionTextColor = UIColor.lightGray 85 | SuggestionsBoxTheme.navigationBarBackgroundColor = UIColor(red:19/255.0, green:100/255.0, blue:155/255.0, alpha: 1.0) 86 | 87 | let navigationBar = UINavigationController.init(rootViewController: suggestionsBox) 88 | self.present(navigationBar, animated: true, completion: nil) 89 | 90 | } 91 | 92 | // MARK : SuggestionsBoxDelegate Methods 93 | 94 | func suggestions() -> Array { 95 | return self.featureRequests 96 | } 97 | 98 | func commentsForSuggestion(_ suggestion: Suggestion) -> Array { 99 | return self.comments.filter({ $0.suggestionId == suggestion.suggestionId }) 100 | } 101 | 102 | func newSuggestionAdded(_ newSuggestion: Suggestion) { 103 | // Refresh online data 104 | self.featureRequests.append(newSuggestion) 105 | } 106 | 107 | func newCommentForSuggestionAdded(_ suggestion: Suggestion, newComment: Comment) { 108 | // Refresh online data 109 | self.comments.append(newComment) 110 | } 111 | 112 | func suggestionFavorited(_ suggestion: Suggestion) { 113 | // Refresh online data 114 | 115 | // Refresh local data 116 | let index = self.featureRequests.index(of: suggestion) 117 | self.featureRequests[index!] = suggestion 118 | } 119 | 120 | func suggestionUnFavorited(_ suggestion: Suggestion) { 121 | // Refresh online data 122 | 123 | // Refresh local data 124 | let index = self.featureRequests.index(of: suggestion) 125 | self.featureRequests[index!] = suggestion 126 | } 127 | 128 | // MARK: Data 129 | 130 | func getDummyData() { 131 | 132 | let suggestion1 = Suggestion.init(suggestionId: "1", title: "Lorem ipsum dolor sit amet", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.", user: "Manuel", favorites: ["4564"], createdAt: Date()) 133 | self.featureRequests.append(suggestion1) 134 | 135 | let suggestion2 = Suggestion.init(suggestionId: "2", title: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", user: "Manuel Escrig Ventura", favorites: ["4564"], createdAt: Date()) 136 | self.featureRequests.append(suggestion2) 137 | 138 | let suggestion3 = Suggestion.init(suggestionId: "3", title: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do", user: "Manuel Escrig Ventura", favorites: ["4564"], createdAt: Date()) 139 | self.featureRequests.append(suggestion3) 140 | 141 | let suggestion4 = Suggestion.init(suggestionId: "4", title: "Lorem ipsum dolor sit amet", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.", user: "Manuel", favorites: ["4564"], createdAt: Date()) 142 | self.featureRequests.append(suggestion4) 143 | 144 | let suggestion5 = Suggestion.init(suggestionId: "5", title: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", user: "Manuel Escrig Ventura", favorites: ["4564"], createdAt: Date()) 145 | self.featureRequests.append(suggestion5) 146 | 147 | let suggestion6 = Suggestion.init(suggestionId: "6", title: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", user: "Manuel Escrig Ventura", favorites: ["4564"], createdAt: Date()) 148 | self.featureRequests.append(suggestion6) 149 | 150 | let comment1 = Comment.init(suggestionId: "1", commentId: "1", description: "Lorem ipsum dolor sit amet", user: "Manuel", createdAt: Date()) 151 | self.comments.append(comment1) 152 | 153 | let comment2 = Comment.init(suggestionId: "2", commentId: "2", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", user: "Manuel", createdAt: Date()) 154 | self.comments.append(comment2) 155 | 156 | let comment3 = Comment.init(suggestionId: "2", commentId: "3", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", user: "Manuel", createdAt: Date()) 157 | self.comments.append(comment3) 158 | 159 | let comment4 = Comment.init(suggestionId: "3", commentId: "4", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", user: "Manuel", createdAt: Date()) 160 | self.comments.append(comment4) 161 | 162 | let comment5 = Comment.init(suggestionId: "4", commentId: "5", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", user: "Manuel", createdAt: Date()) 163 | self.comments.append(comment5) 164 | 165 | let comment6 = Comment.init(suggestionId: "5", commentId: "6", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", user: "Manuel", createdAt: Date()) 166 | self.comments.append(comment6) 167 | 168 | let comment7 = Comment.init(suggestionId: "6", commentId: "7", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", user: "Manuel", createdAt: Date()) 169 | self.comments.append(comment7) 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /SuggestionsBox/Classes/NewSuggestionController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NewSuggestionController.swift 3 | // SuggestionsBox 4 | // An iOS library to aggregate users feedback about suggestions, 5 | // features or comments in order to help you build a better product. 6 | // 7 | // https://github.com/manuelescrig/SuggestionsBox 8 | // 9 | // Created by Manuel Escrig Ventura on 30/04/16. 10 | // Licence: MIT-Licence 11 | 12 | 13 | // MARK: TextViewCell 14 | protocol TextViewCellDelegate: class { 15 | func textDidChange(_ sender: TextViewCell) 16 | } 17 | 18 | class TextViewCell: UITableViewCell, UITextViewDelegate { 19 | 20 | var textView = UITextView() 21 | var constraintsList = [NSLayoutConstraint]() 22 | weak var parentTableView: UITableView? 23 | weak var delegate: TextViewCellDelegate? 24 | 25 | override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 26 | super.init(style: .value1, reuseIdentifier: reuseIdentifier) 27 | self.backgroundColor = SuggestionsBoxTheme.tableCellBackgroundColor 28 | self.contentView.backgroundColor = SuggestionsBoxTheme.tableCellBackgroundColor 29 | 30 | self.textLabel?.textColor = SuggestionsBoxTheme.tableCellTitleTextColor 31 | self.detailTextLabel?.textColor = SuggestionsBoxTheme.tableCellDescriptionTextColor 32 | 33 | textView.contentInset = UIEdgeInsetsMake(0, -3, 0, 0) 34 | textView.delegate = self 35 | textView.backgroundColor = UIColor.clear 36 | textView.textColor = SuggestionsBoxTheme.tableCellTitleTextColor 37 | textView.isOpaque = true 38 | textView.font = UIFont.systemFont(ofSize: 18) 39 | textView.isScrollEnabled = false 40 | textView.showsVerticalScrollIndicator = false 41 | textView.showsHorizontalScrollIndicator = false 42 | textView.translatesAutoresizingMaskIntoConstraints = false 43 | textView.isHidden = true 44 | textView.layer.zPosition = 1000 45 | self.contentView.addSubview(textView) 46 | } 47 | 48 | required init?(coder aDecoder: NSCoder) { 49 | super.init(coder: aDecoder) 50 | } 51 | 52 | override func layoutSubviews() { 53 | super.layoutSubviews() 54 | 55 | self.contentView.removeConstraints(self.constraintsList) 56 | let left = self.parentTableView?.separatorInset.left 57 | let leftConstraint = NSLayoutConstraint(item: self.textView, 58 | attribute:.left, 59 | relatedBy: .equal, 60 | toItem: self.contentView, 61 | attribute: .left, 62 | multiplier: 1.0, 63 | constant: left!) 64 | let rightConstraint = NSLayoutConstraint(item: self.textView, 65 | attribute:.right, 66 | relatedBy: .equal, 67 | toItem: self.contentView, 68 | attribute: .right, 69 | multiplier: 1.0, 70 | constant: -left!) 71 | 72 | self.contentView.addConstraint(NSLayoutConstraint(item: self.textView, 73 | attribute:.top, 74 | relatedBy: .equal, 75 | toItem: self.contentView, 76 | attribute: .top, 77 | multiplier: 1.0, 78 | constant: 3.5)) 79 | 80 | self.contentView.addConstraint(NSLayoutConstraint(item: self.textView, 81 | attribute:.bottom, 82 | relatedBy: .equal, 83 | toItem: self.contentView, 84 | attribute: .bottom, 85 | multiplier: 1.0, 86 | constant: -3.5)) 87 | 88 | self.contentView.addConstraint(leftConstraint) 89 | self.contentView.addConstraint(rightConstraint) 90 | self.constraintsList.append(leftConstraint) 91 | self.constraintsList.append(rightConstraint) 92 | } 93 | 94 | func configure(_ text: String, placeholder: String) -> String { 95 | self.textLabel?.text = placeholder 96 | self.textLabel?.textColor = SuggestionsBoxTheme.tableCellDescriptionTextColor 97 | 98 | self.textView.isHidden = false 99 | self.textView.text = text 100 | self.textView.accessibilityValue = text 101 | self.textView.accessibilityLabel = placeholder 102 | 103 | return self.textView.text 104 | } 105 | 106 | func textViewDidChange(_ textView: UITextView) { 107 | 108 | if textView.text.characters.count > 0 { 109 | self.textLabel?.isHidden = true 110 | } else { 111 | self.textLabel?.isHidden = false 112 | } 113 | 114 | UIView.setAnimationsEnabled(false) 115 | self.parentTableView?.beginUpdates() 116 | self.parentTableView?.endUpdates() 117 | UIView.setAnimationsEnabled(true) 118 | delegate?.textDidChange(self) 119 | } 120 | } 121 | 122 | // MARK: NewSuggestionController 123 | class NewSuggestionController: UITableViewController, UITextFieldDelegate, TextViewCellDelegate { 124 | 125 | weak var delegate: SuggestionsBoxDelegate? 126 | 127 | var titleText = String() 128 | var descriptionText = String() 129 | var footerLabel: UILabel = UILabel.init() 130 | 131 | let cellIdentifier = "TextViewCell" 132 | 133 | // MARK: View Lyfe Cycle 134 | 135 | required convenience init(coder aDecoder: NSCoder) { 136 | self.init(nibName: nil, bundle: nil) 137 | } 138 | 139 | override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: Bundle!) { 140 | super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 141 | } 142 | 143 | override func viewDidLoad() { 144 | super.viewDidLoad() 145 | 146 | // Content View 147 | self.view.backgroundColor = SuggestionsBoxTheme.viewBackgroundColor 148 | 149 | // NavigationBar 150 | self.navigationController!.navigationBar.barTintColor = SuggestionsBoxTheme.navigationBarBackgroundColor 151 | self.navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: SuggestionsBoxTheme.navigationBarTexColor] 152 | self.navigationController!.navigationBar.tintColor = SuggestionsBoxTheme.navigationBarButtonColor 153 | 154 | // Table View 155 | self.tableView.estimatedRowHeight = 34 // Default UITableViewCell Height 156 | self.tableView.rowHeight = UITableViewAutomaticDimension 157 | self.tableView.register(TextViewCell.self, forCellReuseIdentifier: cellIdentifier) 158 | self.tableView.separatorColor = SuggestionsBoxTheme.tableSeparatorColor 159 | self.tableView.backgroundColor = SuggestionsBoxTheme.viewBackgroundColor 160 | 161 | // Footer Label 162 | self.footerLabel.text = SuggestionsBoxTheme.newSuggestionFooterText 163 | self.footerLabel.textAlignment = .center 164 | self.footerLabel.numberOfLines = 3 165 | self.footerLabel.font = UIFont.systemFont(ofSize: 16) 166 | self.footerLabel.textColor = SuggestionsBoxTheme.viewTextColor 167 | self.footerLabel.frame = CGRect(x: SuggestionsBoxTheme.sizeTableViewHeaderViewPadding, y: 0, width: self.view.frame.size.width - SuggestionsBoxTheme.sizeTableViewHeaderViewPadding * 2, height: SuggestionsBoxTheme.sizeTableViewFooterViewHeight) 168 | self.tableView.tableFooterView = self.footerLabel 169 | 170 | // Title 171 | self.title = SuggestionsBoxTheme.newSuggestionTitleText 172 | 173 | // Button 174 | let saveButton = UIBarButtonItem.init(barButtonSystemItem: .save, target: self, action: #selector(save(_:))) 175 | self.navigationItem.setRightBarButton(saveButton, animated: false) 176 | self.navigationItem.rightBarButtonItem?.isEnabled = false 177 | 178 | let cancelButton = UIBarButtonItem.init(barButtonSystemItem: .cancel, target: self, action: #selector(cancel(_:))) 179 | self.navigationItem.setLeftBarButton(cancelButton, animated: false) 180 | } 181 | 182 | 183 | // MARK: UI Actions 184 | 185 | func save(_ sender: UIBarButtonItem) { 186 | 187 | if let delegate = delegate { 188 | let suggestion = Suggestion.init(suggestionId: NewSuggestionController.randomStringWithLength(12), title: titleText, description: descriptionText, user: SuggestionsBoxTheme.user, favorites: [], createdAt: Date()) 189 | delegate.newSuggestionAdded(suggestion) 190 | } 191 | 192 | self.navigationController!.dismiss(animated: true, completion: nil) 193 | } 194 | 195 | 196 | func cancel(_ sender: UIBarButtonItem) { 197 | self.navigationController!.dismiss(animated: true, completion: nil) 198 | } 199 | 200 | 201 | // MARK: UITableView DataSource 202 | 203 | override func numberOfSections(in tableView: UITableView) -> Int { 204 | return 2 205 | } 206 | 207 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 208 | if section == 0 { 209 | return 2 210 | } else { 211 | return 3 212 | } 213 | } 214 | 215 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 216 | 217 | let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! TextViewCell 218 | cell.parentTableView = self.tableView 219 | cell.selectionStyle = .none 220 | 221 | if (indexPath as NSIndexPath).section == 0 { 222 | cell.delegate = self 223 | cell.tag = (indexPath as NSIndexPath).row 224 | if (indexPath as NSIndexPath).row == 0 { 225 | titleText = cell.configure(titleText, placeholder: SuggestionsBoxTheme.newSuggestionTitlePlaceholderText) 226 | } else { 227 | descriptionText = cell.configure(descriptionText, placeholder: SuggestionsBoxTheme.newSuggestionDescriptionPlaceholderText) 228 | } 229 | } else { 230 | if (indexPath as NSIndexPath).row == 0 { 231 | cell.textLabel!.text = SuggestionsBoxTheme.newSuggestionVersionText 232 | cell.detailTextLabel?.text = UIDevice.current.systemVersion 233 | } else if (indexPath as NSIndexPath).row == 1 { 234 | cell.textLabel!.text = SuggestionsBoxTheme.newSuggestionModelText 235 | cell.detailTextLabel?.text = UIDevice.current.model 236 | } else if (indexPath as NSIndexPath).row == 2 { 237 | cell.textLabel!.text = SuggestionsBoxTheme.newSuggestionSystemText 238 | cell.detailTextLabel?.text = UIDevice.current.systemName 239 | } else { 240 | cell.textLabel!.text = "" 241 | cell.detailTextLabel?.text = "" 242 | } 243 | } 244 | return cell 245 | } 246 | 247 | override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 248 | if section == 0 { 249 | return SuggestionsBoxTheme.newSuggestionSuggestionSectionText 250 | } else { 251 | return SuggestionsBoxTheme.newSuggestionDeviceSectionText 252 | } 253 | } 254 | 255 | 256 | // MARK: TextViewCellDelegate 257 | 258 | func textDidChange(_ sender: TextViewCell) { 259 | 260 | if sender.tag == 0 { 261 | titleText = sender.textView.text 262 | } else { 263 | descriptionText = sender.textView.text 264 | } 265 | 266 | if titleText.characters.count > 3 && descriptionText.characters.count > 3 { 267 | self.navigationItem.rightBarButtonItem?.isEnabled = true 268 | } else { 269 | self.navigationItem.rightBarButtonItem?.isEnabled = false 270 | } 271 | } 272 | 273 | // MARK: Helpers 274 | 275 | static func randomStringWithLength(_ len: Int) -> String { 276 | 277 | let letters: NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 278 | let randomString: NSMutableString = NSMutableString(capacity: len) 279 | 280 | for _ in 1...len { 281 | let length = UInt32 (letters.length) 282 | let rand = arc4random_uniform(length) 283 | randomString.appendFormat("%C", letters.character(at: Int(rand))) 284 | } 285 | 286 | return randomString as String 287 | } 288 | } 289 | -------------------------------------------------------------------------------- /SuggestionsBox/Classes/DetailController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailController.swift 3 | // SuggestionsBox 4 | // An iOS library to aggregate users feedback about suggestions, 5 | // features or comments in order to help you build a better product. 6 | // 7 | // https://github.com/manuelescrig/SuggestionsBox 8 | // 9 | // Created by Manuel Escrig Ventura on 30/04/16. 10 | // Licence: MIT-Licence 11 | 12 | 13 | class DetailController: UIViewController, UITableViewDataSource, UITableViewDelegate { 14 | 15 | weak var delegate: SuggestionsBoxDelegate? 16 | 17 | var tableView: UITableView = UITableView.init() 18 | var newCommentButton: UIButton = UIButton.init() 19 | var suggestion: Suggestion? 20 | var comments = [Comment]() 21 | 22 | var isFavorite = false 23 | 24 | let cellIdentifier = "TextViewCell" 25 | 26 | // MARK: View Lyfe Cylce 27 | 28 | required convenience init(coder aDecoder: NSCoder) { 29 | self.init(nibName: nil, bundle: nil) 30 | } 31 | 32 | override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: Bundle!) { 33 | super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 34 | } 35 | 36 | override func viewDidLoad() { 37 | super.viewDidLoad() 38 | 39 | // Content View 40 | self.view.backgroundColor = SuggestionsBoxTheme.viewBackgroundColor 41 | 42 | // NavigationBar 43 | self.navigationController!.navigationBar.barTintColor = SuggestionsBoxTheme.navigationBarBackgroundColor 44 | self.navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: SuggestionsBoxTheme.navigationBarTexColor] 45 | self.navigationController!.navigationBar.tintColor = SuggestionsBoxTheme.navigationBarButtonColor 46 | 47 | // Title 48 | self.title = suggestion?.title 49 | 50 | // Button 51 | let shapeLayer: CAShapeLayer = CAShapeLayer() 52 | shapeLayer.fillColor = UIColor.clear.cgColor 53 | shapeLayer.strokeColor = SuggestionsBoxTheme.navigationBarHeartColor.cgColor 54 | shapeLayer.path = self.bezierHeartShapePathWithWidth(26, atPoint: CGPoint(x: 14, y: 15)).cgPath 55 | let heart: UIButton = UIButton(type: .custom) 56 | heart.showsTouchWhenHighlighted = false 57 | heart.layer.addSublayer(shapeLayer) 58 | heart.bounds = CGRect(x: 0, y: 0, width: 26, height: 26) 59 | heart.addTarget(self, action: #selector(DetailController.favorite(_:)), for: .touchDown) 60 | let heartButtonItem: UIBarButtonItem = UIBarButtonItem(customView: heart) 61 | self.navigationItem.rightBarButtonItem = heartButtonItem 62 | 63 | // TableView 64 | self.tableView.delegate = self 65 | self.tableView.dataSource = self 66 | self.tableView.isMultipleTouchEnabled = false 67 | self.tableView.estimatedRowHeight = 44 68 | self.tableView.rowHeight = UITableViewAutomaticDimension 69 | self.tableView.separatorColor = SuggestionsBoxTheme.tableSeparatorColor 70 | self.tableView.backgroundColor = SuggestionsBoxTheme.viewBackgroundColor 71 | self.tableView.tableFooterView = UIView() 72 | self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier) 73 | self.view.addSubview(self.tableView) 74 | } 75 | 76 | override func viewWillAppear(_ animated: Bool) { 77 | super.viewWillAppear(animated) 78 | 79 | // Get Data 80 | self.getData() 81 | 82 | if (suggestion?.favorites.contains(SuggestionsBoxTheme.userId) == true ) { 83 | self.iconFavoriteSuggestion() 84 | } else { 85 | self.iconUnFavoriteSuggestion() 86 | } 87 | } 88 | 89 | 90 | // MARK: Layout Methods 91 | 92 | override func viewWillLayoutSubviews() { 93 | super.viewWillLayoutSubviews() 94 | 95 | self.tableView.frame = self.view.bounds 96 | self.newCommentButton.frame = CGRect(x: SuggestionsBoxTheme.sizeTableViewCommentButtonViewPadding, y: SuggestionsBoxTheme.sizeTableViewCommentButtonViewPadding, width: self.view.frame.size.width - SuggestionsBoxTheme.sizeTableViewCommentButtonViewPadding * 2, height: SuggestionsBoxTheme.sizeTableViewCellDefaultHeight) 97 | } 98 | 99 | 100 | // MARK: DataSource 101 | 102 | func numberOfSections(in tableView: UITableView) -> Int { 103 | 104 | if SuggestionsBoxTheme.admin { 105 | return 3 106 | } else { 107 | return 2 108 | } 109 | } 110 | 111 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 112 | 113 | switch section { 114 | case 0: 115 | return 6 116 | case 1: 117 | return self.comments.count 118 | case 2: 119 | return 1 120 | default: 121 | return 1 122 | } 123 | } 124 | 125 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 126 | 127 | var cell: UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as UITableViewCell? 128 | if (cell != nil) { 129 | cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: cellIdentifier) 130 | } 131 | 132 | cell!.selectionStyle = .none 133 | cell!.backgroundColor = SuggestionsBoxTheme.tableCellBackgroundColor 134 | cell!.contentView.backgroundColor = SuggestionsBoxTheme.tableCellBackgroundColor 135 | cell!.textLabel!.textColor = SuggestionsBoxTheme.tableCellTitleTextColor 136 | cell!.textLabel!.numberOfLines = 0 137 | cell!.detailTextLabel?.textColor = SuggestionsBoxTheme.tableCellDescriptionTextColor 138 | cell!.detailTextLabel?.numberOfLines = 0 139 | 140 | switch (indexPath as NSIndexPath).section { 141 | case 0: 142 | if (indexPath as NSIndexPath).row == 0 { 143 | cell!.textLabel!.text = suggestion?.title 144 | } else if (indexPath as NSIndexPath).row == 1 { 145 | cell!.textLabel!.text = suggestion?.description 146 | } else if (indexPath as NSIndexPath).row == 2 { 147 | cell!.textLabel!.text = suggestion?.user 148 | } else if (indexPath as NSIndexPath).row == 3 { 149 | cell!.textLabel!.text = suggestion?.dateString() 150 | } else if (indexPath as NSIndexPath).row == 4 { 151 | cell!.textLabel!.text = suggestion?.favoritesString() 152 | } else { 153 | cell!.textLabel!.text = SuggestionsBoxTheme.detailNewCommentText 154 | cell!.textLabel!.font = UIFont.boldSystemFont(ofSize: 18) 155 | } 156 | case 1: 157 | let comment = comments[(indexPath as NSIndexPath).row] 158 | cell!.textLabel!.text = comment.description 159 | cell!.detailTextLabel?.text = comment.user + " - " + comment.dateString() 160 | 161 | case 2: 162 | cell!.textLabel!.text = SuggestionsBoxTheme.detailDeleteText 163 | default: 164 | cell!.textLabel!.text = "" 165 | } 166 | 167 | return cell! 168 | } 169 | 170 | 171 | // MARK: Delegate 172 | 173 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 174 | tableView.deselectRow(at: indexPath, animated: false) 175 | 176 | if (indexPath as NSIndexPath).section == 0 && (indexPath as NSIndexPath).row == 5 { 177 | self.add() 178 | } 179 | } 180 | 181 | func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 182 | var sectionName: String 183 | switch section { 184 | case 0: 185 | sectionName = SuggestionsBoxTheme.detailSuggestionSectionText 186 | case 1: 187 | sectionName = SuggestionsBoxTheme.detailCommentsSectionText 188 | case 2: 189 | sectionName = SuggestionsBoxTheme.detailAdminSectionText 190 | default: 191 | sectionName = "" 192 | } 193 | 194 | return sectionName 195 | } 196 | 197 | 198 | // MARK: Icon Bezier Paths 199 | 200 | func iconFavoriteSuggestion() { 201 | let shapeLayer: CAShapeLayer = CAShapeLayer() 202 | shapeLayer.fillColor = SuggestionsBoxTheme.navigationBarHeartColor.cgColor 203 | shapeLayer.strokeColor = SuggestionsBoxTheme.navigationBarHeartColor.cgColor 204 | shapeLayer.path = self.bezierHeartShapePathWithWidth(26, atPoint: CGPoint(x: 14, y: 15)).cgPath 205 | let heart: UIButton = UIButton(type: .custom) 206 | heart.showsTouchWhenHighlighted = false 207 | heart.layer.addSublayer(shapeLayer) 208 | heart.bounds = CGRect(x: 0, y: 0, width: 26, height: 26) 209 | heart.addTarget(self, action: #selector(DetailController.favorite(_:)), for: .touchDown) 210 | let heartButtonItem: UIBarButtonItem = UIBarButtonItem(customView: heart) 211 | self.navigationItem.rightBarButtonItem = heartButtonItem 212 | self.isFavorite = true 213 | } 214 | 215 | func iconUnFavoriteSuggestion() { 216 | let shapeLayer: CAShapeLayer = CAShapeLayer() 217 | shapeLayer.fillColor = UIColor.clear.cgColor 218 | shapeLayer.strokeColor = SuggestionsBoxTheme.navigationBarHeartColor.cgColor 219 | shapeLayer.path = self.bezierHeartShapePathWithWidth(26, atPoint: CGPoint(x: 14, y: 15)).cgPath 220 | let heart: UIButton = UIButton(type: .custom) 221 | heart.showsTouchWhenHighlighted = false 222 | heart.layer.addSublayer(shapeLayer) 223 | heart.bounds = CGRect(x: 0, y: 0, width: 26, height: 26) 224 | heart.addTarget(self, action: #selector(DetailController.favorite(_:)), for: .touchDown) 225 | let heartButtonItem: UIBarButtonItem = UIBarButtonItem(customView: heart) 226 | self.navigationItem.rightBarButtonItem = heartButtonItem 227 | self.isFavorite = false 228 | } 229 | 230 | func degressToRadians(_ angle: CGFloat) -> CGFloat { 231 | return angle / 180.0 * CGFloat(M_PI) 232 | } 233 | 234 | func bezierHeartShapePathWithWidth(_ width: CGFloat, atPoint center: CGPoint) -> UIBezierPath { 235 | let w: CGFloat = width / 2.5 236 | let path: UIBezierPath = UIBezierPath() 237 | // Left arc 238 | path.addArc(withCenter: CGPoint(x: center.x - w / 2.0, y: center.y - w / 2.0), radius: (w * sqrt(2.0) / 2.0), startAngle: degressToRadians(135.0), endAngle: degressToRadians(-45.0), clockwise: true) 239 | // Right arc 240 | path.addArc(withCenter: CGPoint(x: center.x + w / 2.0, y: center.y - w / 2.0), radius: (w * sqrt(2.0) / 2.0), startAngle: degressToRadians(-135.0), endAngle: degressToRadians(45.0), clockwise: true) 241 | path.addLine(to: CGPoint(x: center.x, y: center.y + w)) 242 | path.addLine(to: CGPoint(x: center.x - w, y: center.y)) 243 | path.close() 244 | return path 245 | } 246 | 247 | 248 | // MARK: UI Actions 249 | 250 | func favorite(_ sender: UIBarButtonItem) { 251 | 252 | if isFavorite { 253 | 254 | let index = suggestion?.favorites.index(of: SuggestionsBoxTheme.userId) 255 | suggestion?.favorites.remove(at: index!) 256 | self.tableView .reloadRows(at: [IndexPath.init(item: 4, section: 0)], with: .top) 257 | 258 | if let delegate = delegate { 259 | delegate.suggestionFavorited(suggestion!) 260 | } 261 | self.iconUnFavoriteSuggestion() 262 | 263 | } else { 264 | 265 | suggestion?.favorites.append(SuggestionsBoxTheme.userId) 266 | self.tableView .reloadRows(at: [IndexPath.init(item: 4, section: 0)], with: .bottom) 267 | if let delegate = delegate { 268 | delegate.suggestionUnFavorited(suggestion!) 269 | } 270 | self.iconFavoriteSuggestion() 271 | } 272 | } 273 | 274 | func add() { 275 | 276 | let newCommentController = NewCommentController(nibName: nil, bundle: nil) 277 | newCommentController.delegate = delegate 278 | newCommentController.suggestion = suggestion 279 | let navigationBar = UINavigationController.init(rootViewController: newCommentController) 280 | self.present(navigationBar, animated: true, completion: nil) 281 | } 282 | 283 | 284 | // MARK: Data 285 | 286 | func getData() { 287 | 288 | if let delegate = delegate { 289 | self.comments = delegate.commentsForSuggestion(suggestion!) 290 | self.comments = self.comments.sorted(by: { $0.createdAt.timeIntervalSinceNow > $1.createdAt.timeIntervalSinceNow }) 291 | self.tableView.reloadData() 292 | } 293 | } 294 | } 295 | -------------------------------------------------------------------------------- /SuggestionsBox/Classes/SuggestionsBox.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SuggestionsBox.swift 3 | // SuggestionsBox 4 | // An iOS library to aggregate users feedback about suggestions, 5 | // features or comments in order to help you build a better product. 6 | // 7 | // https://github.com/manuelescrig/SuggestionsBox 8 | // 9 | // Created by Manuel Escrig Ventura on 30/04/16. 10 | // Licence: MIT-Licence 11 | 12 | /** 13 | * SuggestionsBoxTheme public class that represents the style of the library. 14 | */ 15 | open class SuggestionsBoxTheme { 16 | 17 | /// Name of the app 18 | open static var appName: String = "SuggestionsBox Example" 19 | 20 | /// Name of the SuggestionsBox module 21 | open static var title: String = "SuggestionsBox" 22 | 23 | /// Header text in the list of suggestions 24 | open static var headerText: String = "" 25 | 26 | /// Footer text in the list of suggestions 27 | open static var footerText: String = "" 28 | 29 | open static var detailSuggestionSectionText: String = "Suggestion Info" 30 | open static var detailCommentsSectionText: String = "Comments" 31 | open static var detailAdminSectionText: String = "Admin Options" 32 | open static var detailNewCommentText: String = "Leave a Comment" 33 | open static var detailDeleteText: String = "Delete" 34 | open static var detailFavoriteText: String = "Favorite" 35 | open static var detailFavoritesText: String = "Favorites" 36 | open static var detailDateFormat: String = "yyyy-MM-dd" 37 | 38 | open static var newSuggestionTitleText: String = "New Suggestion" 39 | open static var newSuggestionSuggestionSectionText: String = "Suggestion Info" 40 | open static var newSuggestionDeviceSectionText: String = "Device Info" 41 | open static var newSuggestionTitlePlaceholderText: String = "Enter Title" 42 | open static var newSuggestionDescriptionPlaceholderText: String = "Enter Description" 43 | open static var newSuggestionVersionText: String = "iOS Version" 44 | open static var newSuggestionModelText: String = "Model Name" 45 | open static var newSuggestionSystemText: String = "System Name" 46 | open static var newSuggestionFooterText: String = "Powered by SuggestionsBox" 47 | 48 | open static var newCommentTitleText: String = "New Comment" 49 | open static var newCommentCommentSectionText: String = "Comment Info" 50 | open static var newCommentCommentPlaceholderText: String = "Enter Comment" 51 | open static var newCommentFooterText: String = "Powered by SuggestionsBox" 52 | 53 | // Colors 54 | open static var navigationBarBackgroundColor: UIColor = UINavigationBar.appearance().barTintColor! 55 | open static var navigationBarTexColor: UIColor = UIColor.white 56 | open static var navigationBarButtonColor: UIColor = UIColor.white 57 | open static var navigationBarHeartColor: UIColor = UIColor.red 58 | open static var viewBackgroundColor: UIColor = UIColor.groupTableViewBackground 59 | open static var viewTextColor: UIColor = UIColor.lightGray 60 | open static var tableSeparatorColor: UIColor = UIColor.groupTableViewBackground 61 | open static var tableCellBackgroundColor: UIColor = UIColor.white 62 | open static var tableCellTitleTextColor: UIColor = UIColor.black 63 | open static var tableCellDescriptionTextColor: UIColor = UIColor.lightGray 64 | 65 | // Sizes 66 | open static var sizeSearchViewHeight: CGFloat = 44 67 | open static var sizeTableViewHeaderViewPadding: CGFloat = 10 68 | open static var sizeTableViewHeaderViewHeight: CGFloat = 80 69 | open static var sizeTableViewFooterViewPadding: CGFloat = 10 70 | open static var sizeTableViewFooterViewHeight: CGFloat = 80 71 | open static var sizeTableViewCellDefaultHeight: CGFloat = 44 72 | open static var sizeTableViewCommentButtonViewPadding: CGFloat = 20 73 | 74 | // User 75 | open static var user: String = "Anonymous" 76 | open static var userId: String = "" 77 | open static var admin: Bool = false 78 | 79 | } 80 | 81 | /** 82 | * SuggestionsBoxDelegate public protocol to be implemented in your ViewController 83 | * in order to add the data and receive call-backs. 84 | */ 85 | public protocol SuggestionsBoxDelegate: NSObjectProtocol { 86 | 87 | func suggestions() -> Array 88 | 89 | func commentsForSuggestion(_ suggestion: Suggestion) -> Array 90 | 91 | func newSuggestionAdded(_ newSuggestion: Suggestion) 92 | 93 | func newCommentForSuggestionAdded(_ suggestion: Suggestion, newComment: Comment) 94 | 95 | func suggestionFavorited(_ suggestion: Suggestion) 96 | 97 | func suggestionUnFavorited(_ suggestion: Suggestion) 98 | 99 | } 100 | 101 | /** 102 | * SuggestionsBox public class that represents the main TableViewController. 103 | */ 104 | open class SuggestionsBox: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate { 105 | 106 | open weak var delegate: SuggestionsBoxDelegate? 107 | 108 | var tableView: UITableView = UITableView.init() 109 | var searchBar: UISearchBar = UISearchBar.init() 110 | var headerView: UIView = UIView.init() 111 | var headerLabel: UILabel = UILabel.init() 112 | var footerLabel: UILabel = UILabel.init() 113 | 114 | var featureRequests = [Suggestion]() 115 | var searchResults = [Suggestion]() 116 | 117 | let cellIdentifier = "TextViewCell" 118 | 119 | // MARK: View Lyfe Cylce 120 | 121 | required public convenience init(coder aDecoder: NSCoder) { 122 | self.init(nibName: nil, bundle: nil) 123 | } 124 | 125 | override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: Bundle!) { 126 | super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 127 | } 128 | 129 | override open func viewDidLoad() { 130 | super.viewDidLoad() 131 | 132 | // Content View 133 | self.view.backgroundColor = SuggestionsBoxTheme.viewBackgroundColor 134 | 135 | // NavigationBar 136 | self.navigationController!.navigationBar.barTintColor = SuggestionsBoxTheme.navigationBarBackgroundColor 137 | self.navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: SuggestionsBoxTheme.navigationBarTexColor] 138 | self.navigationController!.navigationBar.tintColor = SuggestionsBoxTheme.navigationBarButtonColor 139 | 140 | // Title 141 | self.title = SuggestionsBoxTheme.title 142 | 143 | // Button 144 | let addButton = UIBarButtonItem.init(barButtonSystemItem: .add, target: self, action: #selector(add(_:))) 145 | self.navigationItem.setRightBarButton(addButton, animated: false) 146 | 147 | let cancelButton = UIBarButtonItem.init(barButtonSystemItem: .done, target: self, action: #selector(done(_:))) 148 | self.navigationItem.setLeftBarButton(cancelButton, animated: false) 149 | 150 | // TableView 151 | self.tableView.delegate = self 152 | self.tableView.dataSource = self 153 | self.tableView.isMultipleTouchEnabled = false 154 | self.tableView.estimatedRowHeight = 44 155 | self.tableView.rowHeight = UITableViewAutomaticDimension 156 | self.tableView.separatorColor = SuggestionsBoxTheme.tableSeparatorColor 157 | self.tableView.backgroundColor = SuggestionsBoxTheme.viewBackgroundColor 158 | self.tableView.tableFooterView = UIView() 159 | self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier) 160 | self.view.addSubview(self.tableView) 161 | 162 | // SearchBar 163 | self.searchBar.delegate = self 164 | self.searchBar.text = "" 165 | 166 | // Header Label 167 | headerLabel.text = SuggestionsBoxTheme.headerText 168 | headerLabel.textAlignment = .center 169 | headerLabel.numberOfLines = 3 170 | headerLabel.font = UIFont.systemFont(ofSize: 16) 171 | headerLabel.textColor = SuggestionsBoxTheme.viewTextColor 172 | headerView.addSubview(headerLabel) 173 | headerView.addSubview(searchBar) 174 | 175 | footerLabel.text = SuggestionsBoxTheme.footerText 176 | footerLabel.textAlignment = .center 177 | footerLabel.numberOfLines = 3 178 | footerLabel.font = UIFont.systemFont(ofSize: 16) 179 | footerLabel.textColor = SuggestionsBoxTheme.viewTextColor 180 | 181 | } 182 | 183 | open override func viewWillAppear(_ animated: Bool) { 184 | super.viewWillAppear(animated) 185 | 186 | // Get Data 187 | self.getData() 188 | } 189 | 190 | open override func viewDidAppear(_ animated: Bool) { 191 | super.viewDidAppear(animated) 192 | 193 | } 194 | 195 | // MARK: Layout Methods 196 | 197 | override open func viewWillLayoutSubviews() { 198 | super.viewWillLayoutSubviews() 199 | 200 | self.searchBar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: SuggestionsBoxTheme.sizeSearchViewHeight) 201 | self.tableView.frame = self.view.bounds 202 | 203 | self.headerLabel.frame = CGRect(x: SuggestionsBoxTheme.sizeTableViewHeaderViewPadding, y: SuggestionsBoxTheme.sizeSearchViewHeight, width: self.view.frame.size.width - SuggestionsBoxTheme.sizeTableViewHeaderViewPadding * 2, height: SuggestionsBoxTheme.sizeTableViewHeaderViewHeight) 204 | self.headerView.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.size.width, height: SuggestionsBoxTheme.sizeTableViewHeaderViewHeight + SuggestionsBoxTheme.sizeSearchViewHeight) 205 | self.tableView.tableHeaderView = self.headerView 206 | 207 | self.footerLabel.frame = CGRect(x: SuggestionsBoxTheme.sizeTableViewHeaderViewPadding, y: 0, width: self.view.frame.size.width - SuggestionsBoxTheme.sizeTableViewHeaderViewPadding * 2, height: SuggestionsBoxTheme.sizeTableViewFooterViewHeight) 208 | self.tableView.tableFooterView = footerLabel 209 | } 210 | 211 | 212 | // MARK: DataSource 213 | 214 | open func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 215 | return self.searchResults.count 216 | } 217 | 218 | open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 219 | let suggestion = searchResults[(indexPath as NSIndexPath).row] 220 | var cell: UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as UITableViewCell? 221 | if (cell != nil) { 222 | cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: cellIdentifier) 223 | } 224 | cell!.backgroundColor = SuggestionsBoxTheme.tableCellBackgroundColor 225 | cell!.contentView.backgroundColor = SuggestionsBoxTheme.tableCellBackgroundColor 226 | cell!.textLabel!.text = suggestion.title 227 | cell!.textLabel!.textColor = SuggestionsBoxTheme.tableCellTitleTextColor 228 | cell!.textLabel!.numberOfLines = 0 229 | cell!.detailTextLabel?.text = suggestion.favoritesString() 230 | cell!.detailTextLabel?.textColor = SuggestionsBoxTheme.tableCellDescriptionTextColor 231 | cell!.detailTextLabel?.numberOfLines = 0 232 | return cell! 233 | } 234 | 235 | 236 | // MARK: Delegate 237 | 238 | open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 239 | self.tableView.deselectRow(at: indexPath, animated: true) 240 | self.searchBar.resignFirstResponder() 241 | 242 | let detailController = DetailController() 243 | detailController.delegate = delegate 244 | detailController.suggestion = searchResults[(indexPath as NSIndexPath).row] 245 | self.navigationController?.pushViewController(detailController, animated: true) 246 | } 247 | 248 | 249 | // MARK: UI Actions 250 | 251 | func done(_ sender: UIBarButtonItem) { 252 | self.navigationController!.dismiss(animated: true, completion: nil) 253 | } 254 | 255 | func add(_ sender: UIBarButtonItem) { 256 | let newSuggestionController = NewSuggestionController(nibName: nil, bundle: nil) 257 | newSuggestionController.delegate = delegate 258 | let navigationBar = UINavigationController.init(rootViewController: newSuggestionController) 259 | self.present(navigationBar, animated: true, completion: nil) 260 | } 261 | 262 | 263 | // MARK: UISearchBar 264 | 265 | open func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 266 | 267 | if searchText.characters.count > 0 { 268 | self.searchResults = self.featureRequests.filter {$0.title.lowercased().contains(searchText) || $0.description.lowercased().contains(searchText.lowercased()) } 269 | } else { 270 | self.searchResults = self.featureRequests 271 | } 272 | self.tableView.reloadData() 273 | } 274 | 275 | 276 | // MARK: Data 277 | 278 | open func reloadData() { 279 | self.getData() 280 | self.tableView.reloadData() 281 | } 282 | 283 | func getData() { 284 | 285 | if let delegate = delegate { 286 | let suggestions = delegate.suggestions() 287 | self.featureRequests = suggestions 288 | self.searchResults = self.featureRequests.sorted(by: { $0.createdAt.timeIntervalSinceNow > $1.createdAt.timeIntervalSinceNow }) 289 | self.tableView.reloadData() 290 | } 291 | } 292 | } 293 | -------------------------------------------------------------------------------- /Example/SuggestionsBox.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 429740BC1D0E9A7700E6BC71 /* Pods_SuggestionsBox_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 429740BB1D0E9A7700E6BC71 /* Pods_SuggestionsBox_Example.framework */; }; 11 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 12 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 13 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 14 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 15 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 16 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; 17 | FE1B9229A7F0EF109A59CF27 /* Pods_SuggestionsBox_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A0D2B8E90B5ABAB2FD764E19 /* Pods_SuggestionsBox_Tests.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = 607FACC81AFB9204008FA782 /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 607FACCF1AFB9204008FA782; 26 | remoteInfo = SuggestionsBox; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 027D495CFDC2C94F5572075F /* SuggestionsBox.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = SuggestionsBox.podspec; path = ../SuggestionsBox.podspec; sourceTree = ""; }; 32 | 28E9AA72860DBCE1E63CAB90 /* Pods-SuggestionsBox_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SuggestionsBox_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests.release.xcconfig"; sourceTree = ""; }; 33 | 429740B91D0E9A6700E6BC71 /* SuggestionsBox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SuggestionsBox.framework; path = "../../../../Library/Developer/Xcode/DerivedData/SuggestionsBox-eukfjertmchtizdjhcfzanepbfra/Build/Products/Debug-iphonesimulator/SuggestionsBox/SuggestionsBox.framework"; sourceTree = ""; }; 34 | 429740BB1D0E9A7700E6BC71 /* Pods_SuggestionsBox_Example.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Pods_SuggestionsBox_Example.framework; path = "../../../../Library/Developer/Xcode/DerivedData/SuggestionsBox-eukfjertmchtizdjhcfzanepbfra/Build/Products/Debug-iphonesimulator/Pods_SuggestionsBox_Example.framework"; sourceTree = ""; }; 35 | 607FACD01AFB9204008FA782 /* SuggestionsBox_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SuggestionsBox_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 38 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 39 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 40 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 41 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 42 | 607FACE51AFB9204008FA782 /* SuggestionsBox_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SuggestionsBox_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 44 | 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 45 | 64AA80D38F864520CE877D4D /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 46 | 6524C3251823520A4EF3949C /* Pods-SuggestionsBox_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SuggestionsBox_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests.debug.xcconfig"; sourceTree = ""; }; 47 | A0D2B8E90B5ABAB2FD764E19 /* Pods_SuggestionsBox_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SuggestionsBox_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | B5DD286A794FBAAF82C40268 /* Pods-SuggestionsBox_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SuggestionsBox_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example.debug.xcconfig"; sourceTree = ""; }; 49 | C056801D384EEA1E1F379A49 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 50 | C34E05CB0C34B27BDCC556A1 /* Pods-SuggestionsBox_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SuggestionsBox_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example.release.xcconfig"; sourceTree = ""; }; 51 | F9C3753D84FC9DA1B496F340 /* Pods_SuggestionsBox_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SuggestionsBox_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | /* End PBXFileReference section */ 53 | 54 | /* Begin PBXFrameworksBuildPhase section */ 55 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | 429740BC1D0E9A7700E6BC71 /* Pods_SuggestionsBox_Example.framework in Frameworks */, 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | 607FACE21AFB9204008FA782 /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | FE1B9229A7F0EF109A59CF27 /* Pods_SuggestionsBox_Tests.framework in Frameworks */, 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | /* End PBXFrameworksBuildPhase section */ 72 | 73 | /* Begin PBXGroup section */ 74 | 607FACC71AFB9204008FA782 = { 75 | isa = PBXGroup; 76 | children = ( 77 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 78 | 607FACD21AFB9204008FA782 /* Example for SuggestionsBox */, 79 | 607FACE81AFB9204008FA782 /* Tests */, 80 | 607FACD11AFB9204008FA782 /* Products */, 81 | 98A627390AE07638E9FC12D1 /* Pods */, 82 | 6CD076CCFA567B0E40B30020 /* Frameworks */, 83 | ); 84 | sourceTree = ""; 85 | }; 86 | 607FACD11AFB9204008FA782 /* Products */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 607FACD01AFB9204008FA782 /* SuggestionsBox_Example.app */, 90 | 607FACE51AFB9204008FA782 /* SuggestionsBox_Tests.xctest */, 91 | ); 92 | name = Products; 93 | sourceTree = ""; 94 | }; 95 | 607FACD21AFB9204008FA782 /* Example for SuggestionsBox */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 99 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 100 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 101 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 102 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 103 | 607FACD31AFB9204008FA782 /* Supporting Files */, 104 | ); 105 | name = "Example for SuggestionsBox"; 106 | path = SuggestionsBox; 107 | sourceTree = ""; 108 | }; 109 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 607FACD41AFB9204008FA782 /* Info.plist */, 113 | ); 114 | name = "Supporting Files"; 115 | sourceTree = ""; 116 | }; 117 | 607FACE81AFB9204008FA782 /* Tests */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 607FACEB1AFB9204008FA782 /* Tests.swift */, 121 | 607FACE91AFB9204008FA782 /* Supporting Files */, 122 | ); 123 | path = Tests; 124 | sourceTree = ""; 125 | }; 126 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 607FACEA1AFB9204008FA782 /* Info.plist */, 130 | ); 131 | name = "Supporting Files"; 132 | sourceTree = ""; 133 | }; 134 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 027D495CFDC2C94F5572075F /* SuggestionsBox.podspec */, 138 | 64AA80D38F864520CE877D4D /* README.md */, 139 | C056801D384EEA1E1F379A49 /* LICENSE */, 140 | ); 141 | name = "Podspec Metadata"; 142 | sourceTree = ""; 143 | }; 144 | 6CD076CCFA567B0E40B30020 /* Frameworks */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 429740BB1D0E9A7700E6BC71 /* Pods_SuggestionsBox_Example.framework */, 148 | 429740B91D0E9A6700E6BC71 /* SuggestionsBox.framework */, 149 | F9C3753D84FC9DA1B496F340 /* Pods_SuggestionsBox_Example.framework */, 150 | A0D2B8E90B5ABAB2FD764E19 /* Pods_SuggestionsBox_Tests.framework */, 151 | ); 152 | name = Frameworks; 153 | sourceTree = ""; 154 | }; 155 | 98A627390AE07638E9FC12D1 /* Pods */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | B5DD286A794FBAAF82C40268 /* Pods-SuggestionsBox_Example.debug.xcconfig */, 159 | C34E05CB0C34B27BDCC556A1 /* Pods-SuggestionsBox_Example.release.xcconfig */, 160 | 6524C3251823520A4EF3949C /* Pods-SuggestionsBox_Tests.debug.xcconfig */, 161 | 28E9AA72860DBCE1E63CAB90 /* Pods-SuggestionsBox_Tests.release.xcconfig */, 162 | ); 163 | name = Pods; 164 | sourceTree = ""; 165 | }; 166 | /* End PBXGroup section */ 167 | 168 | /* Begin PBXNativeTarget section */ 169 | 607FACCF1AFB9204008FA782 /* SuggestionsBox_Example */ = { 170 | isa = PBXNativeTarget; 171 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SuggestionsBox_Example" */; 172 | buildPhases = ( 173 | B66C1456710CBEAAE3C5E3B2 /* [CP] Check Pods Manifest.lock */, 174 | 607FACCC1AFB9204008FA782 /* Sources */, 175 | 607FACCD1AFB9204008FA782 /* Frameworks */, 176 | 607FACCE1AFB9204008FA782 /* Resources */, 177 | 68A46AD46E1425114317AD57 /* [CP] Embed Pods Frameworks */, 178 | AEC8403E90D07439AF23C754 /* [CP] Copy Pods Resources */, 179 | ); 180 | buildRules = ( 181 | ); 182 | dependencies = ( 183 | ); 184 | name = SuggestionsBox_Example; 185 | productName = SuggestionsBox; 186 | productReference = 607FACD01AFB9204008FA782 /* SuggestionsBox_Example.app */; 187 | productType = "com.apple.product-type.application"; 188 | }; 189 | 607FACE41AFB9204008FA782 /* SuggestionsBox_Tests */ = { 190 | isa = PBXNativeTarget; 191 | buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SuggestionsBox_Tests" */; 192 | buildPhases = ( 193 | D52FC2E899AEC6480F660CF4 /* [CP] Check Pods Manifest.lock */, 194 | 607FACE11AFB9204008FA782 /* Sources */, 195 | 607FACE21AFB9204008FA782 /* Frameworks */, 196 | 607FACE31AFB9204008FA782 /* Resources */, 197 | 461622E556097F9D9E311FC5 /* [CP] Embed Pods Frameworks */, 198 | 5B6B124F66989D070A98D7B2 /* [CP] Copy Pods Resources */, 199 | ); 200 | buildRules = ( 201 | ); 202 | dependencies = ( 203 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */, 204 | ); 205 | name = SuggestionsBox_Tests; 206 | productName = Tests; 207 | productReference = 607FACE51AFB9204008FA782 /* SuggestionsBox_Tests.xctest */; 208 | productType = "com.apple.product-type.bundle.unit-test"; 209 | }; 210 | /* End PBXNativeTarget section */ 211 | 212 | /* Begin PBXProject section */ 213 | 607FACC81AFB9204008FA782 /* Project object */ = { 214 | isa = PBXProject; 215 | attributes = { 216 | LastSwiftUpdateCheck = 0720; 217 | LastUpgradeCheck = 0800; 218 | ORGANIZATIONNAME = CocoaPods; 219 | TargetAttributes = { 220 | 607FACCF1AFB9204008FA782 = { 221 | CreatedOnToolsVersion = 6.3.1; 222 | LastSwiftMigration = 0800; 223 | }; 224 | 607FACE41AFB9204008FA782 = { 225 | CreatedOnToolsVersion = 6.3.1; 226 | LastSwiftMigration = 0800; 227 | TestTargetID = 607FACCF1AFB9204008FA782; 228 | }; 229 | }; 230 | }; 231 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "SuggestionsBox" */; 232 | compatibilityVersion = "Xcode 3.2"; 233 | developmentRegion = English; 234 | hasScannedForEncodings = 0; 235 | knownRegions = ( 236 | en, 237 | Base, 238 | ); 239 | mainGroup = 607FACC71AFB9204008FA782; 240 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 241 | projectDirPath = ""; 242 | projectRoot = ""; 243 | targets = ( 244 | 607FACCF1AFB9204008FA782 /* SuggestionsBox_Example */, 245 | 607FACE41AFB9204008FA782 /* SuggestionsBox_Tests */, 246 | ); 247 | }; 248 | /* End PBXProject section */ 249 | 250 | /* Begin PBXResourcesBuildPhase section */ 251 | 607FACCE1AFB9204008FA782 /* Resources */ = { 252 | isa = PBXResourcesBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 256 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 257 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 258 | ); 259 | runOnlyForDeploymentPostprocessing = 0; 260 | }; 261 | 607FACE31AFB9204008FA782 /* Resources */ = { 262 | isa = PBXResourcesBuildPhase; 263 | buildActionMask = 2147483647; 264 | files = ( 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | }; 268 | /* End PBXResourcesBuildPhase section */ 269 | 270 | /* Begin PBXShellScriptBuildPhase section */ 271 | 461622E556097F9D9E311FC5 /* [CP] Embed Pods Frameworks */ = { 272 | isa = PBXShellScriptBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | ); 276 | inputPaths = ( 277 | ); 278 | name = "[CP] Embed Pods Frameworks"; 279 | outputPaths = ( 280 | ); 281 | runOnlyForDeploymentPostprocessing = 0; 282 | shellPath = /bin/sh; 283 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests-frameworks.sh\"\n"; 284 | showEnvVarsInLog = 0; 285 | }; 286 | 5B6B124F66989D070A98D7B2 /* [CP] Copy Pods Resources */ = { 287 | isa = PBXShellScriptBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | ); 291 | inputPaths = ( 292 | ); 293 | name = "[CP] Copy Pods Resources"; 294 | outputPaths = ( 295 | ); 296 | runOnlyForDeploymentPostprocessing = 0; 297 | shellPath = /bin/sh; 298 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests-resources.sh\"\n"; 299 | showEnvVarsInLog = 0; 300 | }; 301 | 68A46AD46E1425114317AD57 /* [CP] Embed Pods Frameworks */ = { 302 | isa = PBXShellScriptBuildPhase; 303 | buildActionMask = 2147483647; 304 | files = ( 305 | ); 306 | inputPaths = ( 307 | ); 308 | name = "[CP] Embed Pods Frameworks"; 309 | outputPaths = ( 310 | ); 311 | runOnlyForDeploymentPostprocessing = 0; 312 | shellPath = /bin/sh; 313 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example-frameworks.sh\"\n"; 314 | showEnvVarsInLog = 0; 315 | }; 316 | AEC8403E90D07439AF23C754 /* [CP] Copy Pods Resources */ = { 317 | isa = PBXShellScriptBuildPhase; 318 | buildActionMask = 2147483647; 319 | files = ( 320 | ); 321 | inputPaths = ( 322 | ); 323 | name = "[CP] Copy Pods Resources"; 324 | outputPaths = ( 325 | ); 326 | runOnlyForDeploymentPostprocessing = 0; 327 | shellPath = /bin/sh; 328 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example-resources.sh\"\n"; 329 | showEnvVarsInLog = 0; 330 | }; 331 | B66C1456710CBEAAE3C5E3B2 /* [CP] Check Pods Manifest.lock */ = { 332 | isa = PBXShellScriptBuildPhase; 333 | buildActionMask = 2147483647; 334 | files = ( 335 | ); 336 | inputPaths = ( 337 | ); 338 | name = "[CP] Check Pods Manifest.lock"; 339 | outputPaths = ( 340 | ); 341 | runOnlyForDeploymentPostprocessing = 0; 342 | shellPath = /bin/sh; 343 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 344 | showEnvVarsInLog = 0; 345 | }; 346 | D52FC2E899AEC6480F660CF4 /* [CP] Check Pods Manifest.lock */ = { 347 | isa = PBXShellScriptBuildPhase; 348 | buildActionMask = 2147483647; 349 | files = ( 350 | ); 351 | inputPaths = ( 352 | ); 353 | name = "[CP] Check Pods Manifest.lock"; 354 | outputPaths = ( 355 | ); 356 | runOnlyForDeploymentPostprocessing = 0; 357 | shellPath = /bin/sh; 358 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 359 | showEnvVarsInLog = 0; 360 | }; 361 | /* End PBXShellScriptBuildPhase section */ 362 | 363 | /* Begin PBXSourcesBuildPhase section */ 364 | 607FACCC1AFB9204008FA782 /* Sources */ = { 365 | isa = PBXSourcesBuildPhase; 366 | buildActionMask = 2147483647; 367 | files = ( 368 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 369 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 370 | ); 371 | runOnlyForDeploymentPostprocessing = 0; 372 | }; 373 | 607FACE11AFB9204008FA782 /* Sources */ = { 374 | isa = PBXSourcesBuildPhase; 375 | buildActionMask = 2147483647; 376 | files = ( 377 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, 378 | ); 379 | runOnlyForDeploymentPostprocessing = 0; 380 | }; 381 | /* End PBXSourcesBuildPhase section */ 382 | 383 | /* Begin PBXTargetDependency section */ 384 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { 385 | isa = PBXTargetDependency; 386 | target = 607FACCF1AFB9204008FA782 /* SuggestionsBox_Example */; 387 | targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; 388 | }; 389 | /* End PBXTargetDependency section */ 390 | 391 | /* Begin PBXVariantGroup section */ 392 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 393 | isa = PBXVariantGroup; 394 | children = ( 395 | 607FACDA1AFB9204008FA782 /* Base */, 396 | ); 397 | name = Main.storyboard; 398 | sourceTree = ""; 399 | }; 400 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 401 | isa = PBXVariantGroup; 402 | children = ( 403 | 607FACDF1AFB9204008FA782 /* Base */, 404 | ); 405 | name = LaunchScreen.xib; 406 | sourceTree = ""; 407 | }; 408 | /* End PBXVariantGroup section */ 409 | 410 | /* Begin XCBuildConfiguration section */ 411 | 607FACED1AFB9204008FA782 /* Debug */ = { 412 | isa = XCBuildConfiguration; 413 | buildSettings = { 414 | ALWAYS_SEARCH_USER_PATHS = NO; 415 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 416 | CLANG_CXX_LIBRARY = "libc++"; 417 | CLANG_ENABLE_MODULES = YES; 418 | CLANG_ENABLE_OBJC_ARC = YES; 419 | CLANG_WARN_BOOL_CONVERSION = YES; 420 | CLANG_WARN_CONSTANT_CONVERSION = YES; 421 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 422 | CLANG_WARN_EMPTY_BODY = YES; 423 | CLANG_WARN_ENUM_CONVERSION = YES; 424 | CLANG_WARN_INFINITE_RECURSION = YES; 425 | CLANG_WARN_INT_CONVERSION = YES; 426 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 427 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 428 | CLANG_WARN_UNREACHABLE_CODE = YES; 429 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 430 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 431 | COPY_PHASE_STRIP = NO; 432 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 433 | ENABLE_STRICT_OBJC_MSGSEND = YES; 434 | ENABLE_TESTABILITY = YES; 435 | GCC_C_LANGUAGE_STANDARD = gnu99; 436 | GCC_DYNAMIC_NO_PIC = NO; 437 | GCC_NO_COMMON_BLOCKS = YES; 438 | GCC_OPTIMIZATION_LEVEL = 0; 439 | GCC_PREPROCESSOR_DEFINITIONS = ( 440 | "DEBUG=1", 441 | "$(inherited)", 442 | ); 443 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 444 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 445 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 446 | GCC_WARN_UNDECLARED_SELECTOR = YES; 447 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 448 | GCC_WARN_UNUSED_FUNCTION = YES; 449 | GCC_WARN_UNUSED_VARIABLE = YES; 450 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 451 | MTL_ENABLE_DEBUG_INFO = YES; 452 | ONLY_ACTIVE_ARCH = YES; 453 | SDKROOT = iphoneos; 454 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 455 | SWIFT_VERSION = 3.0; 456 | }; 457 | name = Debug; 458 | }; 459 | 607FACEE1AFB9204008FA782 /* Release */ = { 460 | isa = XCBuildConfiguration; 461 | buildSettings = { 462 | ALWAYS_SEARCH_USER_PATHS = NO; 463 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 464 | CLANG_CXX_LIBRARY = "libc++"; 465 | CLANG_ENABLE_MODULES = YES; 466 | CLANG_ENABLE_OBJC_ARC = YES; 467 | CLANG_WARN_BOOL_CONVERSION = YES; 468 | CLANG_WARN_CONSTANT_CONVERSION = YES; 469 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 470 | CLANG_WARN_EMPTY_BODY = YES; 471 | CLANG_WARN_ENUM_CONVERSION = YES; 472 | CLANG_WARN_INFINITE_RECURSION = YES; 473 | CLANG_WARN_INT_CONVERSION = YES; 474 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 475 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 476 | CLANG_WARN_UNREACHABLE_CODE = YES; 477 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 478 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 479 | COPY_PHASE_STRIP = NO; 480 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 481 | ENABLE_NS_ASSERTIONS = NO; 482 | ENABLE_STRICT_OBJC_MSGSEND = YES; 483 | GCC_C_LANGUAGE_STANDARD = gnu99; 484 | GCC_NO_COMMON_BLOCKS = YES; 485 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 486 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 487 | GCC_WARN_UNDECLARED_SELECTOR = YES; 488 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 489 | GCC_WARN_UNUSED_FUNCTION = YES; 490 | GCC_WARN_UNUSED_VARIABLE = YES; 491 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 492 | MTL_ENABLE_DEBUG_INFO = NO; 493 | SDKROOT = iphoneos; 494 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 495 | SWIFT_VERSION = 3.0; 496 | VALIDATE_PRODUCT = YES; 497 | }; 498 | name = Release; 499 | }; 500 | 607FACF01AFB9204008FA782 /* Debug */ = { 501 | isa = XCBuildConfiguration; 502 | baseConfigurationReference = B5DD286A794FBAAF82C40268 /* Pods-SuggestionsBox_Example.debug.xcconfig */; 503 | buildSettings = { 504 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 505 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 506 | CODE_SIGN_IDENTITY = "iPhone Developer"; 507 | DEFINES_MODULE = YES; 508 | INFOPLIST_FILE = SuggestionsBox/Info.plist; 509 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 510 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 511 | MODULE_NAME = ExampleApp; 512 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 513 | PRODUCT_NAME = "$(TARGET_NAME)"; 514 | SWIFT_VERSION = 3.0; 515 | TARGETED_DEVICE_FAMILY = "1,2"; 516 | }; 517 | name = Debug; 518 | }; 519 | 607FACF11AFB9204008FA782 /* Release */ = { 520 | isa = XCBuildConfiguration; 521 | baseConfigurationReference = C34E05CB0C34B27BDCC556A1 /* Pods-SuggestionsBox_Example.release.xcconfig */; 522 | buildSettings = { 523 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 524 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 525 | CODE_SIGN_IDENTITY = "iPhone Developer"; 526 | DEFINES_MODULE = YES; 527 | INFOPLIST_FILE = SuggestionsBox/Info.plist; 528 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 529 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 530 | MODULE_NAME = ExampleApp; 531 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 532 | PRODUCT_NAME = "$(TARGET_NAME)"; 533 | SWIFT_VERSION = 3.0; 534 | TARGETED_DEVICE_FAMILY = "1,2"; 535 | }; 536 | name = Release; 537 | }; 538 | 607FACF31AFB9204008FA782 /* Debug */ = { 539 | isa = XCBuildConfiguration; 540 | baseConfigurationReference = 6524C3251823520A4EF3949C /* Pods-SuggestionsBox_Tests.debug.xcconfig */; 541 | buildSettings = { 542 | FRAMEWORK_SEARCH_PATHS = ( 543 | "$(SDKROOT)/Developer/Library/Frameworks", 544 | "$(inherited)", 545 | ); 546 | GCC_PREPROCESSOR_DEFINITIONS = ( 547 | "DEBUG=1", 548 | "$(inherited)", 549 | ); 550 | INFOPLIST_FILE = Tests/Info.plist; 551 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 552 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 553 | PRODUCT_NAME = "$(TARGET_NAME)"; 554 | SWIFT_VERSION = 3.0; 555 | }; 556 | name = Debug; 557 | }; 558 | 607FACF41AFB9204008FA782 /* Release */ = { 559 | isa = XCBuildConfiguration; 560 | baseConfigurationReference = 28E9AA72860DBCE1E63CAB90 /* Pods-SuggestionsBox_Tests.release.xcconfig */; 561 | buildSettings = { 562 | FRAMEWORK_SEARCH_PATHS = ( 563 | "$(SDKROOT)/Developer/Library/Frameworks", 564 | "$(inherited)", 565 | ); 566 | INFOPLIST_FILE = Tests/Info.plist; 567 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 568 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 569 | PRODUCT_NAME = "$(TARGET_NAME)"; 570 | SWIFT_VERSION = 3.0; 571 | }; 572 | name = Release; 573 | }; 574 | /* End XCBuildConfiguration section */ 575 | 576 | /* Begin XCConfigurationList section */ 577 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "SuggestionsBox" */ = { 578 | isa = XCConfigurationList; 579 | buildConfigurations = ( 580 | 607FACED1AFB9204008FA782 /* Debug */, 581 | 607FACEE1AFB9204008FA782 /* Release */, 582 | ); 583 | defaultConfigurationIsVisible = 0; 584 | defaultConfigurationName = Release; 585 | }; 586 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SuggestionsBox_Example" */ = { 587 | isa = XCConfigurationList; 588 | buildConfigurations = ( 589 | 607FACF01AFB9204008FA782 /* Debug */, 590 | 607FACF11AFB9204008FA782 /* Release */, 591 | ); 592 | defaultConfigurationIsVisible = 0; 593 | defaultConfigurationName = Release; 594 | }; 595 | 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "SuggestionsBox_Tests" */ = { 596 | isa = XCConfigurationList; 597 | buildConfigurations = ( 598 | 607FACF31AFB9204008FA782 /* Debug */, 599 | 607FACF41AFB9204008FA782 /* Release */, 600 | ); 601 | defaultConfigurationIsVisible = 0; 602 | defaultConfigurationName = Release; 603 | }; 604 | /* End XCConfigurationList section */ 605 | }; 606 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 607 | } 608 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0589C0AB2312E5BF3D4E6F2028A9C398 /* Pods-SuggestionsBox_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F36A8B7F3C59A1787A9BD817E60E807 /* Pods-SuggestionsBox_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 129FBC38FE75556FBB2569A991347EA4 /* Pods-SuggestionsBox_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D1E6CFA2E2A907CC6EC581C396095F6F /* Pods-SuggestionsBox_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 379AE6F2DAE056A47BB7E61D3D131079 /* Suggestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0922D874DB7DB00FAF94BA81FE3BEE4 /* Suggestion.swift */; }; 13 | 429740B81D0E968900E6BC71 /* SuggestionsBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = B773BBF7DBC707910F5B3BD3BD03F592 /* SuggestionsBox.swift */; }; 14 | 64292E855AB2975627BA646F21945BC0 /* SuggestionsBox-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7178159730D59DE778686854155355D3 /* SuggestionsBox-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | 66B933AC73878444CC3067F4AB24FB96 /* DetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F580C0E75ECEA0DEC5B56A1AE10F3A9 /* DetailController.swift */; }; 16 | 6CA0D6FC6351DB199DC96F6EECFD8091 /* Pods-SuggestionsBox_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 11454707A1A3C64EE36A6A72733E21A0 /* Pods-SuggestionsBox_Tests-dummy.m */; }; 17 | 7E6A72FBC26D0B4E22CB4417B60E2703 /* SuggestionsBox-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8ED1AC4BC6EF347A5BD26BFBDB2806C7 /* SuggestionsBox-dummy.m */; }; 18 | 91BAA761B7FE89835CD60324731C9763 /* Pods-SuggestionsBox_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E64C3563ABC39873D589EFE6CE47CAA /* Pods-SuggestionsBox_Example-dummy.m */; }; 19 | 9359E6C148E3F08C5F6BFE5FB872BE0C /* NewSuggestionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79DDC412F95AEC8D0601709E897F29D3 /* NewSuggestionController.swift */; }; 20 | A81E47BACE9D2E3FE36B2D92D66D51C2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEC22C73C1608DFA5D5D78BDCB218219 /* Foundation.framework */; }; 21 | B1CC526D28FA4BCF368D71659F974846 /* Comment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233EEEA4D6E65A2711FE43CC2C642C62 /* Comment.swift */; }; 22 | CB11666A350E30C968A481CA2B504A19 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEC22C73C1608DFA5D5D78BDCB218219 /* Foundation.framework */; }; 23 | D7ECF51977637A8AD30ECA55CA522975 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEC22C73C1608DFA5D5D78BDCB218219 /* Foundation.framework */; }; 24 | F84D827C664BC48D1A67019D1E21A254 /* NewCommentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 903925029BE30D0D831B2AA7261633D7 /* NewCommentController.swift */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXContainerItemProxy section */ 28 | 4A16CE97E6128739A1B580BC5C3E466C /* PBXContainerItemProxy */ = { 29 | isa = PBXContainerItemProxy; 30 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 31 | proxyType = 1; 32 | remoteGlobalIDString = 1BDB4501EF533065FB97E5AA6780C77C; 33 | remoteInfo = SuggestionsBox; 34 | }; 35 | /* End PBXContainerItemProxy section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 041CFD1D5318EEF41F7B179534D4BF56 /* SuggestionsBox.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SuggestionsBox.xcconfig; sourceTree = ""; }; 39 | 0A6C86E0E3B9FD4873A2C1FE74149080 /* Pods-SuggestionsBox_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-SuggestionsBox_Example-acknowledgements.markdown"; sourceTree = ""; }; 40 | 0F580C0E75ECEA0DEC5B56A1AE10F3A9 /* DetailController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DetailController.swift; sourceTree = ""; }; 41 | 11454707A1A3C64EE36A6A72733E21A0 /* Pods-SuggestionsBox_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-SuggestionsBox_Tests-dummy.m"; sourceTree = ""; }; 42 | 233EEEA4D6E65A2711FE43CC2C642C62 /* Comment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Comment.swift; sourceTree = ""; }; 43 | 258904D1DE767D5BD2D7B0E6657406D4 /* Pods-SuggestionsBox_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SuggestionsBox_Tests.release.xcconfig"; sourceTree = ""; }; 44 | 276228A5A2F9716EB2B401E8F688E931 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | 2F36A8B7F3C59A1787A9BD817E60E807 /* Pods-SuggestionsBox_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-SuggestionsBox_Example-umbrella.h"; sourceTree = ""; }; 46 | 3753FB85BDC3F4B2001AB6E3D62C2E0E /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | 400C45B1514727897C7AD4E1FAD9C2B0 /* Pods_SuggestionsBox_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SuggestionsBox_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | 4B5E7C2BB8B592B8B06D369193361743 /* SuggestionsBox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SuggestionsBox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 4FB34C0021651BF9C0608D3F65FD0AED /* Pods-SuggestionsBox_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SuggestionsBox_Example.release.xcconfig"; sourceTree = ""; }; 50 | 538D90DBF3FFA4502746739D83E23051 /* Pods-SuggestionsBox_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SuggestionsBox_Tests-frameworks.sh"; sourceTree = ""; }; 51 | 583E6FE012A42CDC20CDE372DBA3658C /* SuggestionsBox-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SuggestionsBox-prefix.pch"; sourceTree = ""; }; 52 | 7178159730D59DE778686854155355D3 /* SuggestionsBox-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SuggestionsBox-umbrella.h"; sourceTree = ""; }; 53 | 7529E69E48DCD4FE4356C6B14D97EE8E /* Pods-SuggestionsBox_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-SuggestionsBox_Example.modulemap"; sourceTree = ""; }; 54 | 76512595E0938B61E924E259EA4A860D /* Pods-SuggestionsBox_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SuggestionsBox_Tests.debug.xcconfig"; sourceTree = ""; }; 55 | 79DDC412F95AEC8D0601709E897F29D3 /* NewSuggestionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NewSuggestionController.swift; sourceTree = ""; }; 56 | 85949F72F2CE1CF052665F3E284CDFE6 /* Pods-SuggestionsBox_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SuggestionsBox_Example-frameworks.sh"; sourceTree = ""; }; 57 | 8ED1AC4BC6EF347A5BD26BFBDB2806C7 /* SuggestionsBox-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SuggestionsBox-dummy.m"; sourceTree = ""; }; 58 | 903925029BE30D0D831B2AA7261633D7 /* NewCommentController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NewCommentController.swift; sourceTree = ""; }; 59 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 60 | 9D36798B564AF24EE7F5F7B5D04D9A08 /* Pods-SuggestionsBox_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-SuggestionsBox_Tests-acknowledgements.markdown"; sourceTree = ""; }; 61 | 9E64C3563ABC39873D589EFE6CE47CAA /* Pods-SuggestionsBox_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-SuggestionsBox_Example-dummy.m"; sourceTree = ""; }; 62 | A494A6EC73559FF31E36F1CF7E531DBE /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 63 | B773BBF7DBC707910F5B3BD3BD03F592 /* SuggestionsBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SuggestionsBox.swift; sourceTree = ""; }; 64 | B9B72FD28FA4F4B06FAE879836736A39 /* Pods-SuggestionsBox_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SuggestionsBox_Example-acknowledgements.plist"; sourceTree = ""; }; 65 | BB28976549B171383659A06038826F58 /* Pods-SuggestionsBox_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-SuggestionsBox_Tests.modulemap"; sourceTree = ""; }; 66 | BB4BBCFF303026C63C394C8BC4795D9A /* Pods-SuggestionsBox_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SuggestionsBox_Example-resources.sh"; sourceTree = ""; }; 67 | BF1EDB8EA31FC22D313F5A061AF9F477 /* Pods-SuggestionsBox_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SuggestionsBox_Example.debug.xcconfig"; sourceTree = ""; }; 68 | C206399500DE0DA9C27983317086CF9E /* Pods-SuggestionsBox_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SuggestionsBox_Tests-acknowledgements.plist"; sourceTree = ""; }; 69 | C9A32EEE8B4BD6E9CDA5D4870FCEDFAA /* SuggestionsBox.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SuggestionsBox.modulemap; sourceTree = ""; }; 70 | CEC22C73C1608DFA5D5D78BDCB218219 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 71 | D0922D874DB7DB00FAF94BA81FE3BEE4 /* Suggestion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Suggestion.swift; sourceTree = ""; }; 72 | D1E6CFA2E2A907CC6EC581C396095F6F /* Pods-SuggestionsBox_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-SuggestionsBox_Tests-umbrella.h"; sourceTree = ""; }; 73 | F8173434B3331B2059A7476F26A231E0 /* Pods_SuggestionsBox_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SuggestionsBox_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74 | FDF454AD8AC38C5F7D8641380550B690 /* Pods-SuggestionsBox_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SuggestionsBox_Tests-resources.sh"; sourceTree = ""; }; 75 | /* End PBXFileReference section */ 76 | 77 | /* Begin PBXFrameworksBuildPhase section */ 78 | 83A3633DD1348126A791CBCF487C64C1 /* Frameworks */ = { 79 | isa = PBXFrameworksBuildPhase; 80 | buildActionMask = 2147483647; 81 | files = ( 82 | A81E47BACE9D2E3FE36B2D92D66D51C2 /* Foundation.framework in Frameworks */, 83 | ); 84 | runOnlyForDeploymentPostprocessing = 0; 85 | }; 86 | 8C9FF717AC9D229AFDAC2692E1234027 /* Frameworks */ = { 87 | isa = PBXFrameworksBuildPhase; 88 | buildActionMask = 2147483647; 89 | files = ( 90 | D7ECF51977637A8AD30ECA55CA522975 /* Foundation.framework in Frameworks */, 91 | ); 92 | runOnlyForDeploymentPostprocessing = 0; 93 | }; 94 | C9D9B48724F61252A05C692A75FCFCE8 /* Frameworks */ = { 95 | isa = PBXFrameworksBuildPhase; 96 | buildActionMask = 2147483647; 97 | files = ( 98 | CB11666A350E30C968A481CA2B504A19 /* Foundation.framework in Frameworks */, 99 | ); 100 | runOnlyForDeploymentPostprocessing = 0; 101 | }; 102 | /* End PBXFrameworksBuildPhase section */ 103 | 104 | /* Begin PBXGroup section */ 105 | 17ADFE7A62898EEDF35F7087FE941BBB /* Products */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 400C45B1514727897C7AD4E1FAD9C2B0 /* Pods_SuggestionsBox_Example.framework */, 109 | F8173434B3331B2059A7476F26A231E0 /* Pods_SuggestionsBox_Tests.framework */, 110 | 4B5E7C2BB8B592B8B06D369193361743 /* SuggestionsBox.framework */, 111 | ); 112 | name = Products; 113 | sourceTree = ""; 114 | }; 115 | 2F4863ABB5E3309ECD14E4D4168865E1 /* Pods-SuggestionsBox_Tests */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 276228A5A2F9716EB2B401E8F688E931 /* Info.plist */, 119 | BB28976549B171383659A06038826F58 /* Pods-SuggestionsBox_Tests.modulemap */, 120 | 9D36798B564AF24EE7F5F7B5D04D9A08 /* Pods-SuggestionsBox_Tests-acknowledgements.markdown */, 121 | C206399500DE0DA9C27983317086CF9E /* Pods-SuggestionsBox_Tests-acknowledgements.plist */, 122 | 11454707A1A3C64EE36A6A72733E21A0 /* Pods-SuggestionsBox_Tests-dummy.m */, 123 | 538D90DBF3FFA4502746739D83E23051 /* Pods-SuggestionsBox_Tests-frameworks.sh */, 124 | FDF454AD8AC38C5F7D8641380550B690 /* Pods-SuggestionsBox_Tests-resources.sh */, 125 | D1E6CFA2E2A907CC6EC581C396095F6F /* Pods-SuggestionsBox_Tests-umbrella.h */, 126 | 76512595E0938B61E924E259EA4A860D /* Pods-SuggestionsBox_Tests.debug.xcconfig */, 127 | 258904D1DE767D5BD2D7B0E6657406D4 /* Pods-SuggestionsBox_Tests.release.xcconfig */, 128 | ); 129 | name = "Pods-SuggestionsBox_Tests"; 130 | path = "Target Support Files/Pods-SuggestionsBox_Tests"; 131 | sourceTree = ""; 132 | }; 133 | 3DCAB2B7CDE207B3958B6CB957FCC758 /* iOS */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | CEC22C73C1608DFA5D5D78BDCB218219 /* Foundation.framework */, 137 | ); 138 | name = iOS; 139 | sourceTree = ""; 140 | }; 141 | 554F49C75657AF3CC5A8F62B37021D3E /* SuggestionsBox */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | DFC55CA6DB3FB2D3BCCFE02DF74B8699 /* SuggestionsBox */, 145 | 5EA72EC55B10E7DDF8163EDA33AC55EC /* Support Files */, 146 | ); 147 | name = SuggestionsBox; 148 | path = ../..; 149 | sourceTree = ""; 150 | }; 151 | 5EA72EC55B10E7DDF8163EDA33AC55EC /* Support Files */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | 3753FB85BDC3F4B2001AB6E3D62C2E0E /* Info.plist */, 155 | C9A32EEE8B4BD6E9CDA5D4870FCEDFAA /* SuggestionsBox.modulemap */, 156 | 041CFD1D5318EEF41F7B179534D4BF56 /* SuggestionsBox.xcconfig */, 157 | 8ED1AC4BC6EF347A5BD26BFBDB2806C7 /* SuggestionsBox-dummy.m */, 158 | 583E6FE012A42CDC20CDE372DBA3658C /* SuggestionsBox-prefix.pch */, 159 | 7178159730D59DE778686854155355D3 /* SuggestionsBox-umbrella.h */, 160 | ); 161 | name = "Support Files"; 162 | path = "Example/Pods/Target Support Files/SuggestionsBox"; 163 | sourceTree = ""; 164 | }; 165 | 7DB346D0F39D3F0E887471402A8071AB = { 166 | isa = PBXGroup; 167 | children = ( 168 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 169 | 921DA655D040402FB120968B87DCB6DB /* Development Pods */, 170 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 171 | 17ADFE7A62898EEDF35F7087FE941BBB /* Products */, 172 | DCCD6BED82BB11686063AD7FB4E16EFB /* Targets Support Files */, 173 | ); 174 | sourceTree = ""; 175 | }; 176 | 921DA655D040402FB120968B87DCB6DB /* Development Pods */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | 554F49C75657AF3CC5A8F62B37021D3E /* SuggestionsBox */, 180 | ); 181 | name = "Development Pods"; 182 | sourceTree = ""; 183 | }; 184 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | 3DCAB2B7CDE207B3958B6CB957FCC758 /* iOS */, 188 | ); 189 | name = Frameworks; 190 | sourceTree = ""; 191 | }; 192 | DCCD6BED82BB11686063AD7FB4E16EFB /* Targets Support Files */ = { 193 | isa = PBXGroup; 194 | children = ( 195 | EB0D8CB92E4B3CB7B3B80243E51ECE2B /* Pods-SuggestionsBox_Example */, 196 | 2F4863ABB5E3309ECD14E4D4168865E1 /* Pods-SuggestionsBox_Tests */, 197 | ); 198 | name = "Targets Support Files"; 199 | sourceTree = ""; 200 | }; 201 | DFC55CA6DB3FB2D3BCCFE02DF74B8699 /* SuggestionsBox */ = { 202 | isa = PBXGroup; 203 | children = ( 204 | FF7AF8267742DB3F6F79E94B984EEF66 /* Classes */, 205 | ); 206 | path = SuggestionsBox; 207 | sourceTree = ""; 208 | }; 209 | EB0D8CB92E4B3CB7B3B80243E51ECE2B /* Pods-SuggestionsBox_Example */ = { 210 | isa = PBXGroup; 211 | children = ( 212 | A494A6EC73559FF31E36F1CF7E531DBE /* Info.plist */, 213 | 7529E69E48DCD4FE4356C6B14D97EE8E /* Pods-SuggestionsBox_Example.modulemap */, 214 | 0A6C86E0E3B9FD4873A2C1FE74149080 /* Pods-SuggestionsBox_Example-acknowledgements.markdown */, 215 | B9B72FD28FA4F4B06FAE879836736A39 /* Pods-SuggestionsBox_Example-acknowledgements.plist */, 216 | 9E64C3563ABC39873D589EFE6CE47CAA /* Pods-SuggestionsBox_Example-dummy.m */, 217 | 85949F72F2CE1CF052665F3E284CDFE6 /* Pods-SuggestionsBox_Example-frameworks.sh */, 218 | BB4BBCFF303026C63C394C8BC4795D9A /* Pods-SuggestionsBox_Example-resources.sh */, 219 | 2F36A8B7F3C59A1787A9BD817E60E807 /* Pods-SuggestionsBox_Example-umbrella.h */, 220 | BF1EDB8EA31FC22D313F5A061AF9F477 /* Pods-SuggestionsBox_Example.debug.xcconfig */, 221 | 4FB34C0021651BF9C0608D3F65FD0AED /* Pods-SuggestionsBox_Example.release.xcconfig */, 222 | ); 223 | name = "Pods-SuggestionsBox_Example"; 224 | path = "Target Support Files/Pods-SuggestionsBox_Example"; 225 | sourceTree = ""; 226 | }; 227 | FF7AF8267742DB3F6F79E94B984EEF66 /* Classes */ = { 228 | isa = PBXGroup; 229 | children = ( 230 | 233EEEA4D6E65A2711FE43CC2C642C62 /* Comment.swift */, 231 | 0F580C0E75ECEA0DEC5B56A1AE10F3A9 /* DetailController.swift */, 232 | 903925029BE30D0D831B2AA7261633D7 /* NewCommentController.swift */, 233 | 79DDC412F95AEC8D0601709E897F29D3 /* NewSuggestionController.swift */, 234 | D0922D874DB7DB00FAF94BA81FE3BEE4 /* Suggestion.swift */, 235 | B773BBF7DBC707910F5B3BD3BD03F592 /* SuggestionsBox.swift */, 236 | ); 237 | path = Classes; 238 | sourceTree = ""; 239 | }; 240 | /* End PBXGroup section */ 241 | 242 | /* Begin PBXHeadersBuildPhase section */ 243 | 49C9872B1E6506542EC8CBF675FA4F6D /* Headers */ = { 244 | isa = PBXHeadersBuildPhase; 245 | buildActionMask = 2147483647; 246 | files = ( 247 | 129FBC38FE75556FBB2569A991347EA4 /* Pods-SuggestionsBox_Tests-umbrella.h in Headers */, 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | }; 251 | 92A29D089E45073C539DEC6DB3F2E7F8 /* Headers */ = { 252 | isa = PBXHeadersBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | 0589C0AB2312E5BF3D4E6F2028A9C398 /* Pods-SuggestionsBox_Example-umbrella.h in Headers */, 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | }; 259 | E82155675313B70EC4C2B029CCD387A3 /* Headers */ = { 260 | isa = PBXHeadersBuildPhase; 261 | buildActionMask = 2147483647; 262 | files = ( 263 | 64292E855AB2975627BA646F21945BC0 /* SuggestionsBox-umbrella.h in Headers */, 264 | ); 265 | runOnlyForDeploymentPostprocessing = 0; 266 | }; 267 | /* End PBXHeadersBuildPhase section */ 268 | 269 | /* Begin PBXNativeTarget section */ 270 | 1BDB4501EF533065FB97E5AA6780C77C /* SuggestionsBox */ = { 271 | isa = PBXNativeTarget; 272 | buildConfigurationList = DEF4A3C2BBC54A67F7809A5823BAEBFE /* Build configuration list for PBXNativeTarget "SuggestionsBox" */; 273 | buildPhases = ( 274 | DFE60BE659834B91FA1DC404ACB3E8FF /* Sources */, 275 | 83A3633DD1348126A791CBCF487C64C1 /* Frameworks */, 276 | E82155675313B70EC4C2B029CCD387A3 /* Headers */, 277 | ); 278 | buildRules = ( 279 | ); 280 | dependencies = ( 281 | ); 282 | name = SuggestionsBox; 283 | productName = SuggestionsBox; 284 | productReference = 4B5E7C2BB8B592B8B06D369193361743 /* SuggestionsBox.framework */; 285 | productType = "com.apple.product-type.framework"; 286 | }; 287 | B52E88A5CCF8F5FB1D9F80B63DB42EE8 /* Pods-SuggestionsBox_Tests */ = { 288 | isa = PBXNativeTarget; 289 | buildConfigurationList = 531410266C0E0BA9032F11BF32FFF703 /* Build configuration list for PBXNativeTarget "Pods-SuggestionsBox_Tests" */; 290 | buildPhases = ( 291 | 3EF94968C0DF6E69696A13523E964D41 /* Sources */, 292 | C9D9B48724F61252A05C692A75FCFCE8 /* Frameworks */, 293 | 49C9872B1E6506542EC8CBF675FA4F6D /* Headers */, 294 | ); 295 | buildRules = ( 296 | ); 297 | dependencies = ( 298 | ); 299 | name = "Pods-SuggestionsBox_Tests"; 300 | productName = "Pods-SuggestionsBox_Tests"; 301 | productReference = F8173434B3331B2059A7476F26A231E0 /* Pods_SuggestionsBox_Tests.framework */; 302 | productType = "com.apple.product-type.framework"; 303 | }; 304 | E1FC23EB70C5B4E5A4614A0EA74C3DE6 /* Pods-SuggestionsBox_Example */ = { 305 | isa = PBXNativeTarget; 306 | buildConfigurationList = 4DD6600354A9A441DF13A6ED70273551 /* Build configuration list for PBXNativeTarget "Pods-SuggestionsBox_Example" */; 307 | buildPhases = ( 308 | A50F3CD48D5EA2C0644FF7140C19ED5A /* Sources */, 309 | 8C9FF717AC9D229AFDAC2692E1234027 /* Frameworks */, 310 | 92A29D089E45073C539DEC6DB3F2E7F8 /* Headers */, 311 | ); 312 | buildRules = ( 313 | ); 314 | dependencies = ( 315 | 97C5023F72D75FC6C480085F4AD39840 /* PBXTargetDependency */, 316 | ); 317 | name = "Pods-SuggestionsBox_Example"; 318 | productName = "Pods-SuggestionsBox_Example"; 319 | productReference = 400C45B1514727897C7AD4E1FAD9C2B0 /* Pods_SuggestionsBox_Example.framework */; 320 | productType = "com.apple.product-type.framework"; 321 | }; 322 | /* End PBXNativeTarget section */ 323 | 324 | /* Begin PBXProject section */ 325 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 326 | isa = PBXProject; 327 | attributes = { 328 | LastSwiftUpdateCheck = 0730; 329 | LastUpgradeCheck = 0700; 330 | TargetAttributes = { 331 | 1BDB4501EF533065FB97E5AA6780C77C = { 332 | LastSwiftMigration = 0800; 333 | }; 334 | E1FC23EB70C5B4E5A4614A0EA74C3DE6 = { 335 | LastSwiftMigration = 0800; 336 | }; 337 | }; 338 | }; 339 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 340 | compatibilityVersion = "Xcode 3.2"; 341 | developmentRegion = English; 342 | hasScannedForEncodings = 0; 343 | knownRegions = ( 344 | en, 345 | ); 346 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 347 | productRefGroup = 17ADFE7A62898EEDF35F7087FE941BBB /* Products */; 348 | projectDirPath = ""; 349 | projectRoot = ""; 350 | targets = ( 351 | E1FC23EB70C5B4E5A4614A0EA74C3DE6 /* Pods-SuggestionsBox_Example */, 352 | B52E88A5CCF8F5FB1D9F80B63DB42EE8 /* Pods-SuggestionsBox_Tests */, 353 | 1BDB4501EF533065FB97E5AA6780C77C /* SuggestionsBox */, 354 | ); 355 | }; 356 | /* End PBXProject section */ 357 | 358 | /* Begin PBXSourcesBuildPhase section */ 359 | 3EF94968C0DF6E69696A13523E964D41 /* Sources */ = { 360 | isa = PBXSourcesBuildPhase; 361 | buildActionMask = 2147483647; 362 | files = ( 363 | 6CA0D6FC6351DB199DC96F6EECFD8091 /* Pods-SuggestionsBox_Tests-dummy.m in Sources */, 364 | ); 365 | runOnlyForDeploymentPostprocessing = 0; 366 | }; 367 | A50F3CD48D5EA2C0644FF7140C19ED5A /* Sources */ = { 368 | isa = PBXSourcesBuildPhase; 369 | buildActionMask = 2147483647; 370 | files = ( 371 | 91BAA761B7FE89835CD60324731C9763 /* Pods-SuggestionsBox_Example-dummy.m in Sources */, 372 | ); 373 | runOnlyForDeploymentPostprocessing = 0; 374 | }; 375 | DFE60BE659834B91FA1DC404ACB3E8FF /* Sources */ = { 376 | isa = PBXSourcesBuildPhase; 377 | buildActionMask = 2147483647; 378 | files = ( 379 | B1CC526D28FA4BCF368D71659F974846 /* Comment.swift in Sources */, 380 | 66B933AC73878444CC3067F4AB24FB96 /* DetailController.swift in Sources */, 381 | F84D827C664BC48D1A67019D1E21A254 /* NewCommentController.swift in Sources */, 382 | 9359E6C148E3F08C5F6BFE5FB872BE0C /* NewSuggestionController.swift in Sources */, 383 | 379AE6F2DAE056A47BB7E61D3D131079 /* Suggestion.swift in Sources */, 384 | 7E6A72FBC26D0B4E22CB4417B60E2703 /* SuggestionsBox-dummy.m in Sources */, 385 | 429740B81D0E968900E6BC71 /* SuggestionsBox.swift in Sources */, 386 | ); 387 | runOnlyForDeploymentPostprocessing = 0; 388 | }; 389 | /* End PBXSourcesBuildPhase section */ 390 | 391 | /* Begin PBXTargetDependency section */ 392 | 97C5023F72D75FC6C480085F4AD39840 /* PBXTargetDependency */ = { 393 | isa = PBXTargetDependency; 394 | name = SuggestionsBox; 395 | target = 1BDB4501EF533065FB97E5AA6780C77C /* SuggestionsBox */; 396 | targetProxy = 4A16CE97E6128739A1B580BC5C3E466C /* PBXContainerItemProxy */; 397 | }; 398 | /* End PBXTargetDependency section */ 399 | 400 | /* Begin XCBuildConfiguration section */ 401 | 0ACDCBCB0B6796575F46FFA2F5410C6B /* Release */ = { 402 | isa = XCBuildConfiguration; 403 | buildSettings = { 404 | ALWAYS_SEARCH_USER_PATHS = NO; 405 | CLANG_ANALYZER_NONNULL = YES; 406 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 407 | CLANG_CXX_LIBRARY = "libc++"; 408 | CLANG_ENABLE_MODULES = YES; 409 | CLANG_ENABLE_OBJC_ARC = YES; 410 | CLANG_WARN_BOOL_CONVERSION = YES; 411 | CLANG_WARN_CONSTANT_CONVERSION = YES; 412 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 413 | CLANG_WARN_EMPTY_BODY = YES; 414 | CLANG_WARN_ENUM_CONVERSION = YES; 415 | CLANG_WARN_INT_CONVERSION = YES; 416 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 417 | CLANG_WARN_UNREACHABLE_CODE = YES; 418 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 419 | COPY_PHASE_STRIP = YES; 420 | ENABLE_NS_ASSERTIONS = NO; 421 | GCC_C_LANGUAGE_STANDARD = gnu99; 422 | GCC_PREPROCESSOR_DEFINITIONS = ( 423 | "POD_CONFIGURATION_RELEASE=1", 424 | "$(inherited)", 425 | ); 426 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 427 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 428 | GCC_WARN_UNDECLARED_SELECTOR = YES; 429 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 430 | GCC_WARN_UNUSED_FUNCTION = YES; 431 | GCC_WARN_UNUSED_VARIABLE = YES; 432 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 433 | STRIP_INSTALLED_PRODUCT = NO; 434 | SWIFT_VERSION = 3.0; 435 | SYMROOT = "${SRCROOT}/../build"; 436 | VALIDATE_PRODUCT = YES; 437 | }; 438 | name = Release; 439 | }; 440 | 4A437EDBBD1ECBB2716ABE6A67F8D075 /* Release */ = { 441 | isa = XCBuildConfiguration; 442 | baseConfigurationReference = 258904D1DE767D5BD2D7B0E6657406D4 /* Pods-SuggestionsBox_Tests.release.xcconfig */; 443 | buildSettings = { 444 | CODE_SIGN_IDENTITY = "iPhone Developer"; 445 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 446 | CURRENT_PROJECT_VERSION = 1; 447 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 448 | DEFINES_MODULE = YES; 449 | DYLIB_COMPATIBILITY_VERSION = 1; 450 | DYLIB_CURRENT_VERSION = 1; 451 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 452 | ENABLE_STRICT_OBJC_MSGSEND = YES; 453 | GCC_NO_COMMON_BLOCKS = YES; 454 | INFOPLIST_FILE = "Target Support Files/Pods-SuggestionsBox_Tests/Info.plist"; 455 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 456 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 457 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 458 | MACH_O_TYPE = staticlib; 459 | MODULEMAP_FILE = "Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests.modulemap"; 460 | MTL_ENABLE_DEBUG_INFO = NO; 461 | OTHER_LDFLAGS = ""; 462 | OTHER_LIBTOOLFLAGS = ""; 463 | PODS_ROOT = "$(SRCROOT)"; 464 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 465 | PRODUCT_NAME = Pods_SuggestionsBox_Tests; 466 | SDKROOT = iphoneos; 467 | SKIP_INSTALL = YES; 468 | TARGETED_DEVICE_FAMILY = "1,2"; 469 | VERSIONING_SYSTEM = "apple-generic"; 470 | VERSION_INFO_PREFIX = ""; 471 | }; 472 | name = Release; 473 | }; 474 | 64139CAED61DC8B403ECC5E42E77AEF9 /* Release */ = { 475 | isa = XCBuildConfiguration; 476 | baseConfigurationReference = 041CFD1D5318EEF41F7B179534D4BF56 /* SuggestionsBox.xcconfig */; 477 | buildSettings = { 478 | CODE_SIGN_IDENTITY = "iPhone Developer"; 479 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 480 | CURRENT_PROJECT_VERSION = 1; 481 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 482 | DEFINES_MODULE = YES; 483 | DYLIB_COMPATIBILITY_VERSION = 1; 484 | DYLIB_CURRENT_VERSION = 1; 485 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 486 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; 487 | ENABLE_STRICT_OBJC_MSGSEND = YES; 488 | GCC_NO_COMMON_BLOCKS = YES; 489 | GCC_PREFIX_HEADER = "Target Support Files/SuggestionsBox/SuggestionsBox-prefix.pch"; 490 | INFOPLIST_FILE = "Target Support Files/SuggestionsBox/Info.plist"; 491 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 492 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 493 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 494 | MODULEMAP_FILE = "Target Support Files/SuggestionsBox/SuggestionsBox.modulemap"; 495 | MTL_ENABLE_DEBUG_INFO = NO; 496 | PRODUCT_NAME = SuggestionsBox; 497 | SDKROOT = iphoneos; 498 | SKIP_INSTALL = YES; 499 | SWIFT_OBJC_BRIDGING_HEADER = ""; 500 | SWIFT_VERSION = 3.0; 501 | TARGETED_DEVICE_FAMILY = "1,2"; 502 | VERSIONING_SYSTEM = "apple-generic"; 503 | VERSION_INFO_PREFIX = ""; 504 | }; 505 | name = Release; 506 | }; 507 | 7A39F4760274AE6AC00A31D324DC20F5 /* Debug */ = { 508 | isa = XCBuildConfiguration; 509 | baseConfigurationReference = 76512595E0938B61E924E259EA4A860D /* Pods-SuggestionsBox_Tests.debug.xcconfig */; 510 | buildSettings = { 511 | CODE_SIGN_IDENTITY = "iPhone Developer"; 512 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 513 | CURRENT_PROJECT_VERSION = 1; 514 | DEBUG_INFORMATION_FORMAT = dwarf; 515 | DEFINES_MODULE = YES; 516 | DYLIB_COMPATIBILITY_VERSION = 1; 517 | DYLIB_CURRENT_VERSION = 1; 518 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 519 | ENABLE_STRICT_OBJC_MSGSEND = YES; 520 | GCC_NO_COMMON_BLOCKS = YES; 521 | INFOPLIST_FILE = "Target Support Files/Pods-SuggestionsBox_Tests/Info.plist"; 522 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 523 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 524 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 525 | MACH_O_TYPE = staticlib; 526 | MODULEMAP_FILE = "Target Support Files/Pods-SuggestionsBox_Tests/Pods-SuggestionsBox_Tests.modulemap"; 527 | MTL_ENABLE_DEBUG_INFO = YES; 528 | OTHER_LDFLAGS = ""; 529 | OTHER_LIBTOOLFLAGS = ""; 530 | PODS_ROOT = "$(SRCROOT)"; 531 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 532 | PRODUCT_NAME = Pods_SuggestionsBox_Tests; 533 | SDKROOT = iphoneos; 534 | SKIP_INSTALL = YES; 535 | TARGETED_DEVICE_FAMILY = "1,2"; 536 | VERSIONING_SYSTEM = "apple-generic"; 537 | VERSION_INFO_PREFIX = ""; 538 | }; 539 | name = Debug; 540 | }; 541 | A58483115F5BE80AE5A1C277B4FB15CE /* Release */ = { 542 | isa = XCBuildConfiguration; 543 | baseConfigurationReference = 4FB34C0021651BF9C0608D3F65FD0AED /* Pods-SuggestionsBox_Example.release.xcconfig */; 544 | buildSettings = { 545 | CODE_SIGN_IDENTITY = "iPhone Developer"; 546 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 547 | CURRENT_PROJECT_VERSION = 1; 548 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 549 | DEFINES_MODULE = YES; 550 | DYLIB_COMPATIBILITY_VERSION = 1; 551 | DYLIB_CURRENT_VERSION = 1; 552 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 553 | ENABLE_STRICT_OBJC_MSGSEND = YES; 554 | GCC_NO_COMMON_BLOCKS = YES; 555 | INFOPLIST_FILE = "Target Support Files/Pods-SuggestionsBox_Example/Info.plist"; 556 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 557 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 558 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 559 | MACH_O_TYPE = staticlib; 560 | MODULEMAP_FILE = "Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example.modulemap"; 561 | MTL_ENABLE_DEBUG_INFO = NO; 562 | OTHER_LDFLAGS = ""; 563 | OTHER_LIBTOOLFLAGS = ""; 564 | PODS_ROOT = "$(SRCROOT)"; 565 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 566 | PRODUCT_NAME = Pods_SuggestionsBox_Example; 567 | SDKROOT = iphoneos; 568 | SKIP_INSTALL = YES; 569 | SWIFT_VERSION = 3.0; 570 | TARGETED_DEVICE_FAMILY = "1,2"; 571 | VERSIONING_SYSTEM = "apple-generic"; 572 | VERSION_INFO_PREFIX = ""; 573 | }; 574 | name = Release; 575 | }; 576 | BE7C73B24B5247F860F97C3EF04FC3CA /* Debug */ = { 577 | isa = XCBuildConfiguration; 578 | baseConfigurationReference = BF1EDB8EA31FC22D313F5A061AF9F477 /* Pods-SuggestionsBox_Example.debug.xcconfig */; 579 | buildSettings = { 580 | CODE_SIGN_IDENTITY = "iPhone Developer"; 581 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 582 | CURRENT_PROJECT_VERSION = 1; 583 | DEBUG_INFORMATION_FORMAT = dwarf; 584 | DEFINES_MODULE = YES; 585 | DYLIB_COMPATIBILITY_VERSION = 1; 586 | DYLIB_CURRENT_VERSION = 1; 587 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 588 | ENABLE_STRICT_OBJC_MSGSEND = YES; 589 | GCC_NO_COMMON_BLOCKS = YES; 590 | INFOPLIST_FILE = "Target Support Files/Pods-SuggestionsBox_Example/Info.plist"; 591 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 592 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 593 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 594 | MACH_O_TYPE = staticlib; 595 | MODULEMAP_FILE = "Target Support Files/Pods-SuggestionsBox_Example/Pods-SuggestionsBox_Example.modulemap"; 596 | MTL_ENABLE_DEBUG_INFO = YES; 597 | OTHER_LDFLAGS = ""; 598 | OTHER_LIBTOOLFLAGS = ""; 599 | PODS_ROOT = "$(SRCROOT)"; 600 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 601 | PRODUCT_NAME = Pods_SuggestionsBox_Example; 602 | SDKROOT = iphoneos; 603 | SKIP_INSTALL = YES; 604 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 605 | SWIFT_VERSION = 3.0; 606 | TARGETED_DEVICE_FAMILY = "1,2"; 607 | VERSIONING_SYSTEM = "apple-generic"; 608 | VERSION_INFO_PREFIX = ""; 609 | }; 610 | name = Debug; 611 | }; 612 | D3E3D092A3FF7311A98E44BBA36FFD12 /* Debug */ = { 613 | isa = XCBuildConfiguration; 614 | buildSettings = { 615 | ALWAYS_SEARCH_USER_PATHS = NO; 616 | CLANG_ANALYZER_NONNULL = YES; 617 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 618 | CLANG_CXX_LIBRARY = "libc++"; 619 | CLANG_ENABLE_MODULES = YES; 620 | CLANG_ENABLE_OBJC_ARC = YES; 621 | CLANG_WARN_BOOL_CONVERSION = YES; 622 | CLANG_WARN_CONSTANT_CONVERSION = YES; 623 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 624 | CLANG_WARN_EMPTY_BODY = YES; 625 | CLANG_WARN_ENUM_CONVERSION = YES; 626 | CLANG_WARN_INT_CONVERSION = YES; 627 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 628 | CLANG_WARN_UNREACHABLE_CODE = YES; 629 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 630 | COPY_PHASE_STRIP = NO; 631 | ENABLE_TESTABILITY = YES; 632 | GCC_C_LANGUAGE_STANDARD = gnu99; 633 | GCC_DYNAMIC_NO_PIC = NO; 634 | GCC_OPTIMIZATION_LEVEL = 0; 635 | GCC_PREPROCESSOR_DEFINITIONS = ( 636 | "POD_CONFIGURATION_DEBUG=1", 637 | "DEBUG=1", 638 | "$(inherited)", 639 | ); 640 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 641 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 642 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 643 | GCC_WARN_UNDECLARED_SELECTOR = YES; 644 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 645 | GCC_WARN_UNUSED_FUNCTION = YES; 646 | GCC_WARN_UNUSED_VARIABLE = YES; 647 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 648 | ONLY_ACTIVE_ARCH = YES; 649 | STRIP_INSTALLED_PRODUCT = NO; 650 | SWIFT_VERSION = 3.0; 651 | SYMROOT = "${SRCROOT}/../build"; 652 | }; 653 | name = Debug; 654 | }; 655 | E7621EE83F446A1BB03EDEBF5FC7FEAC /* Debug */ = { 656 | isa = XCBuildConfiguration; 657 | baseConfigurationReference = 041CFD1D5318EEF41F7B179534D4BF56 /* SuggestionsBox.xcconfig */; 658 | buildSettings = { 659 | CODE_SIGN_IDENTITY = "iPhone Developer"; 660 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 661 | CURRENT_PROJECT_VERSION = 1; 662 | DEBUG_INFORMATION_FORMAT = dwarf; 663 | DEFINES_MODULE = YES; 664 | DYLIB_COMPATIBILITY_VERSION = 1; 665 | DYLIB_CURRENT_VERSION = 1; 666 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 667 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; 668 | ENABLE_STRICT_OBJC_MSGSEND = YES; 669 | GCC_NO_COMMON_BLOCKS = YES; 670 | GCC_PREFIX_HEADER = "Target Support Files/SuggestionsBox/SuggestionsBox-prefix.pch"; 671 | INFOPLIST_FILE = "Target Support Files/SuggestionsBox/Info.plist"; 672 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 673 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 674 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 675 | MODULEMAP_FILE = "Target Support Files/SuggestionsBox/SuggestionsBox.modulemap"; 676 | MTL_ENABLE_DEBUG_INFO = YES; 677 | PRODUCT_NAME = SuggestionsBox; 678 | SDKROOT = iphoneos; 679 | SKIP_INSTALL = YES; 680 | SWIFT_OBJC_BRIDGING_HEADER = ""; 681 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 682 | SWIFT_VERSION = 3.0; 683 | TARGETED_DEVICE_FAMILY = "1,2"; 684 | VERSIONING_SYSTEM = "apple-generic"; 685 | VERSION_INFO_PREFIX = ""; 686 | }; 687 | name = Debug; 688 | }; 689 | /* End XCBuildConfiguration section */ 690 | 691 | /* Begin XCConfigurationList section */ 692 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 693 | isa = XCConfigurationList; 694 | buildConfigurations = ( 695 | D3E3D092A3FF7311A98E44BBA36FFD12 /* Debug */, 696 | 0ACDCBCB0B6796575F46FFA2F5410C6B /* Release */, 697 | ); 698 | defaultConfigurationIsVisible = 0; 699 | defaultConfigurationName = Release; 700 | }; 701 | 4DD6600354A9A441DF13A6ED70273551 /* Build configuration list for PBXNativeTarget "Pods-SuggestionsBox_Example" */ = { 702 | isa = XCConfigurationList; 703 | buildConfigurations = ( 704 | BE7C73B24B5247F860F97C3EF04FC3CA /* Debug */, 705 | A58483115F5BE80AE5A1C277B4FB15CE /* Release */, 706 | ); 707 | defaultConfigurationIsVisible = 0; 708 | defaultConfigurationName = Release; 709 | }; 710 | 531410266C0E0BA9032F11BF32FFF703 /* Build configuration list for PBXNativeTarget "Pods-SuggestionsBox_Tests" */ = { 711 | isa = XCConfigurationList; 712 | buildConfigurations = ( 713 | 7A39F4760274AE6AC00A31D324DC20F5 /* Debug */, 714 | 4A437EDBBD1ECBB2716ABE6A67F8D075 /* Release */, 715 | ); 716 | defaultConfigurationIsVisible = 0; 717 | defaultConfigurationName = Release; 718 | }; 719 | DEF4A3C2BBC54A67F7809A5823BAEBFE /* Build configuration list for PBXNativeTarget "SuggestionsBox" */ = { 720 | isa = XCConfigurationList; 721 | buildConfigurations = ( 722 | E7621EE83F446A1BB03EDEBF5FC7FEAC /* Debug */, 723 | 64139CAED61DC8B403ECC5E42E77AEF9 /* Release */, 724 | ); 725 | defaultConfigurationIsVisible = 0; 726 | defaultConfigurationName = Release; 727 | }; 728 | /* End XCConfigurationList section */ 729 | }; 730 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 731 | } 732 | --------------------------------------------------------------------------------