Adds example flipper plugin in swift sample app (#329)

Summary:
This PR adds the example flipper plugin in swift sample app. Example flipper plugin acts as an example for the plugin authors. The example flipper plugin was already added in an objective c example but the swift sample app didn't have it.
Pull Request resolved: https://github.com/facebook/flipper/pull/329

Reviewed By: jknoxville

Differential Revision: D13085611

Pulled By: priteshrnandgaonkar

fbshipit-source-id: d86cca43e95592ecca8d9991d170e62170b8217b
This commit is contained in:
Pritesh Nandgaonkar
2018-11-19 01:47:53 -08:00
committed by Facebook Github Bot
parent ed93c98313
commit 6e1c1d57f9
6 changed files with 203 additions and 1 deletions

View File

@@ -71,6 +71,7 @@ Pod::Spec.new do |spec|
'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h', 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h',
'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h', 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h',
'iOS/FBDefines/FBMacros.h', 'iOS/FBDefines/FBMacros.h',
'iOS/Plugins/FlipperKitExamplePlugin/FlipperKitExamplePlugin/FlipperKitExamplePlugin.h',
'iOS/FlipperKit/**/{FlipperDiagnosticsViewController,FlipperStateUpdateListener,FlipperClient,FlipperPlugin,FlipperConnection,FlipperResponder,SKMacros}.h' 'iOS/FlipperKit/**/{FlipperDiagnosticsViewController,FlipperStateUpdateListener,FlipperClient,FlipperPlugin,FlipperConnection,FlipperResponder,SKMacros}.h'
header_search_paths = "\"$(PODS_ROOT)/FlipperKit/iOS/FlipperKit\" \"$(PODS_ROOT)\"/Headers/Private/FlipperKit/** \"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_ROOT)/PeerTalkSonar\"" header_search_paths = "\"$(PODS_ROOT)/FlipperKit/iOS/FlipperKit\" \"$(PODS_ROOT)\"/Headers/Private/FlipperKit/** \"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_ROOT)/PeerTalkSonar\""
ss.pod_target_xcconfig = { "USE_HEADERMAP" => "NO", ss.pod_target_xcconfig = { "USE_HEADERMAP" => "NO",

View File

@@ -9,6 +9,7 @@ target 'SampleSwift' do
pod 'FlipperKit', :path => '../../FlipperKit.podspec' pod 'FlipperKit', :path => '../../FlipperKit.podspec'
pod 'FlipperKit/SKIOSNetworkPlugin', :path => '../../FlipperKit.podspec' pod 'FlipperKit/SKIOSNetworkPlugin', :path => '../../FlipperKit.podspec'
pod 'FlipperKit/FlipperKitUserDefaultsPlugin', :path => '../../FlipperKit.podspec' pod 'FlipperKit/FlipperKitUserDefaultsPlugin', :path => '../../FlipperKit.podspec'
pod 'FlipperKit/FlipperKitExamplePlugin', :path => '../../FlipperKit.podspec'
# Layout and network plugins are not yet supported for swift projects # Layout and network plugins are not yet supported for swift projects
pod 'FlipperKit/FlipperKitLayoutComponentKitSupport', :path => '../../FlipperKit.podspec' pod 'FlipperKit/FlipperKitLayoutComponentKitSupport', :path => '../../FlipperKit.podspec'

View File

@@ -10,6 +10,7 @@
322121E8134CB1102F388691 /* libPods-SampleSwift.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6233B2BCBACBB2E8D715CC04 /* libPods-SampleSwift.a */; }; 322121E8134CB1102F388691 /* libPods-SampleSwift.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6233B2BCBACBB2E8D715CC04 /* libPods-SampleSwift.a */; };
4E102343216ADB5900160734 /* UserDefaultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E102342216ADB5900160734 /* UserDefaultsViewController.swift */; }; 4E102343216ADB5900160734 /* UserDefaultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E102342216ADB5900160734 /* UserDefaultsViewController.swift */; };
532FF2DF211316ED00FC5A10 /* NetworkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532FF2DE211316ED00FC5A10 /* NetworkViewController.swift */; }; 532FF2DF211316ED00FC5A10 /* NetworkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532FF2DE211316ED00FC5A10 /* NetworkViewController.swift */; };
53C327E5219DDCA800FE7A4C /* CommunicationDemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C327E4219DDCA800FE7A4C /* CommunicationDemoViewController.swift */; };
A19C402720E20023004BF1F7 /* Icons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A19C402620E20023004BF1F7 /* Icons.xcassets */; }; A19C402720E20023004BF1F7 /* Icons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A19C402620E20023004BF1F7 /* Icons.xcassets */; };
A1EC522D20DED61B007C6977 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EC522C20DED61B007C6977 /* AppDelegate.swift */; }; A1EC522D20DED61B007C6977 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EC522C20DED61B007C6977 /* AppDelegate.swift */; };
A1EC522F20DED61B007C6977 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EC522E20DED61B007C6977 /* ViewController.swift */; }; A1EC522F20DED61B007C6977 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EC522E20DED61B007C6977 /* ViewController.swift */; };
@@ -20,6 +21,7 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
4E102342216ADB5900160734 /* UserDefaultsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsViewController.swift; sourceTree = "<group>"; }; 4E102342216ADB5900160734 /* UserDefaultsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsViewController.swift; sourceTree = "<group>"; };
532FF2DE211316ED00FC5A10 /* NetworkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkViewController.swift; sourceTree = "<group>"; }; 532FF2DE211316ED00FC5A10 /* NetworkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkViewController.swift; sourceTree = "<group>"; };
53C327E4219DDCA800FE7A4C /* CommunicationDemoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunicationDemoViewController.swift; sourceTree = "<group>"; };
6233B2BCBACBB2E8D715CC04 /* libPods-SampleSwift.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SampleSwift.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6233B2BCBACBB2E8D715CC04 /* libPods-SampleSwift.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SampleSwift.a"; sourceTree = BUILT_PRODUCTS_DIR; };
82933F6ACB19D9FAA4A0B0DC /* Pods-SampleSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleSwift.release.xcconfig"; path = "Pods/Target Support Files/Pods-SampleSwift/Pods-SampleSwift.release.xcconfig"; sourceTree = "<group>"; }; 82933F6ACB19D9FAA4A0B0DC /* Pods-SampleSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleSwift.release.xcconfig"; path = "Pods/Target Support Files/Pods-SampleSwift/Pods-SampleSwift.release.xcconfig"; sourceTree = "<group>"; };
871A353CDDB4CD0F4FE9A564 /* Pods-SampleSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleSwift.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SampleSwift/Pods-SampleSwift.debug.xcconfig"; sourceTree = "<group>"; }; 871A353CDDB4CD0F4FE9A564 /* Pods-SampleSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleSwift.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SampleSwift/Pods-SampleSwift.debug.xcconfig"; sourceTree = "<group>"; };
@@ -81,6 +83,7 @@
A1EC523820DED61C007C6977 /* Info.plist */, A1EC523820DED61C007C6977 /* Info.plist */,
532FF2DE211316ED00FC5A10 /* NetworkViewController.swift */, 532FF2DE211316ED00FC5A10 /* NetworkViewController.swift */,
4E102342216ADB5900160734 /* UserDefaultsViewController.swift */, 4E102342216ADB5900160734 /* UserDefaultsViewController.swift */,
53C327E4219DDCA800FE7A4C /* CommunicationDemoViewController.swift */,
); );
path = SampleSwift; path = SampleSwift;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -188,6 +191,7 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
A1EC522F20DED61B007C6977 /* ViewController.swift in Sources */, A1EC522F20DED61B007C6977 /* ViewController.swift in Sources */,
53C327E5219DDCA800FE7A4C /* CommunicationDemoViewController.swift in Sources */,
532FF2DF211316ED00FC5A10 /* NetworkViewController.swift in Sources */, 532FF2DF211316ED00FC5A10 /* NetworkViewController.swift in Sources */,
4E102343216ADB5900160734 /* UserDefaultsViewController.swift in Sources */, 4E102343216ADB5900160734 /* UserDefaultsViewController.swift in Sources */,
A1EC522D20DED61B007C6977 /* AppDelegate.swift in Sources */, A1EC522D20DED61B007C6977 /* AppDelegate.swift in Sources */,

View File

@@ -19,6 +19,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
client?.add(FlipperKitLayoutPlugin(rootNode: application, with: layoutDescriptorMapper!)) client?.add(FlipperKitLayoutPlugin(rootNode: application, with: layoutDescriptorMapper!))
client?.add(FlipperKitNetworkPlugin(networkAdapter: SKIOSNetworkAdapter())) client?.add(FlipperKitNetworkPlugin(networkAdapter: SKIOSNetworkAdapter()))
client?.add(FlipperKitExamplePlugin.sharedInstance());
client?.add(FKUserDefaultsPlugin.init(suiteName: nil)) client?.add(FKUserDefaultsPlugin.init(suiteName: nil))
client?.start() client?.start()

View File

@@ -0,0 +1,42 @@
// Copyright 2004-present Facebook. All Rights Reserved.
import UIKit
import FlipperKit
class CommunicationDemoViewController: UIViewController, UITableViewDataSource, FlipperKitExampleCommunicationResponderDelegate {
@IBOutlet weak var messageField: UITextField!
@IBOutlet weak var tableView: UITableView!
var messageArray: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
FlipperKitExamplePlugin.sharedInstance()?.delegate = self
}
@IBAction func tappedTriggerNotification(_ sender: UIButton) {
FlipperKitExamplePlugin.sharedInstance()?.triggerNotification();
}
@IBAction func tappedSendMessage(_ sender: UIButton) {
if let message = self.messageField.text {
FlipperKitExamplePlugin.sharedInstance()?.sendMessage(message);
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reusableCell", for: indexPath)
cell.textLabel?.text = messageArray[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return messageArray.count;
}
func messageReceived(_ msg: String!) {
messageArray.append(msg)
DispatchQueue.main.async { [weak self] in
self?.tableView.reloadData();
}
}
}

View File

@@ -59,6 +59,20 @@
<segue destination="qXL-iV-l3f" kind="show" id="ubf-Kh-d0a"/> <segue destination="qXL-iV-l3f" kind="show" id="ubf-Kh-d0a"/>
</connections> </connections>
</button> </button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pK8-Er-7VT">
<rect key="frame" x="0.0" y="224" width="375" height="60"/>
<color key="backgroundColor" red="0.89411764709999997" green="0.87450980389999999" blue="0.92941176469999998" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="60" id="X69-d9-lWV"/>
<constraint firstAttribute="height" constant="60" id="lWC-Aw-qgK"/>
</constraints>
<state key="normal" title="Notifications/Communications Demo">
<color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<segue destination="yO7-0r-4b7" kind="push" id="ie2-1n-TND"/>
</connections>
</button>
</subviews> </subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints> <constraints>
@@ -66,14 +80,17 @@
<constraint firstItem="xh0-Q4-60g" firstAttribute="top" secondItem="R0E-21-TJB" secondAttribute="bottom" constant="8" id="1LN-rK-SJg"/> <constraint firstItem="xh0-Q4-60g" firstAttribute="top" secondItem="R0E-21-TJB" secondAttribute="bottom" constant="8" id="1LN-rK-SJg"/>
<constraint firstItem="fNm-CZ-QXA" firstAttribute="trailing" secondItem="xh0-Q4-60g" secondAttribute="trailing" id="4Dh-7z-set"/> <constraint firstItem="fNm-CZ-QXA" firstAttribute="trailing" secondItem="xh0-Q4-60g" secondAttribute="trailing" id="4Dh-7z-set"/>
<constraint firstItem="R0E-21-TJB" firstAttribute="top" secondItem="fhd-5r-dZW" secondAttribute="top" id="4Og-b3-TDg"/> <constraint firstItem="R0E-21-TJB" firstAttribute="top" secondItem="fhd-5r-dZW" secondAttribute="top" id="4Og-b3-TDg"/>
<constraint firstItem="pK8-Er-7VT" firstAttribute="leading" secondItem="fhd-5r-dZW" secondAttribute="leading" id="4nX-jB-ggf"/>
<constraint firstItem="fNm-CZ-QXA" firstAttribute="leading" secondItem="xh0-Q4-60g" secondAttribute="leading" id="61y-q6-PKw"/> <constraint firstItem="fNm-CZ-QXA" firstAttribute="leading" secondItem="xh0-Q4-60g" secondAttribute="leading" id="61y-q6-PKw"/>
<constraint firstItem="R0E-21-TJB" firstAttribute="leading" secondItem="fhd-5r-dZW" secondAttribute="leading" id="7mG-cL-FY7"/> <constraint firstItem="R0E-21-TJB" firstAttribute="leading" secondItem="fhd-5r-dZW" secondAttribute="leading" id="7mG-cL-FY7"/>
<constraint firstItem="xh0-Q4-60g" firstAttribute="leading" secondItem="fhd-5r-dZW" secondAttribute="leading" id="DPX-l5-Rca"/> <constraint firstItem="xh0-Q4-60g" firstAttribute="leading" secondItem="fhd-5r-dZW" secondAttribute="leading" id="DPX-l5-Rca"/>
<constraint firstItem="pK8-Er-7VT" firstAttribute="top" secondItem="fNm-CZ-QXA" secondAttribute="bottom" constant="8" id="EFP-DQ-bTM"/>
<constraint firstItem="B57-dd-H6T" firstAttribute="leading" secondItem="fhd-5r-dZW" secondAttribute="leading" id="Hhd-in-vfk"/> <constraint firstItem="B57-dd-H6T" firstAttribute="leading" secondItem="fhd-5r-dZW" secondAttribute="leading" id="Hhd-in-vfk"/>
<constraint firstItem="fhd-5r-dZW" firstAttribute="trailing" secondItem="B57-dd-H6T" secondAttribute="trailing" id="ODW-CJ-ean"/> <constraint firstItem="fhd-5r-dZW" firstAttribute="trailing" secondItem="B57-dd-H6T" secondAttribute="trailing" id="ODW-CJ-ean"/>
<constraint firstItem="fhd-5r-dZW" firstAttribute="trailing" secondItem="R0E-21-TJB" secondAttribute="trailing" id="QyG-ez-XwS"/> <constraint firstItem="fhd-5r-dZW" firstAttribute="trailing" secondItem="R0E-21-TJB" secondAttribute="trailing" id="QyG-ez-XwS"/>
<constraint firstItem="fNm-CZ-QXA" firstAttribute="top" secondItem="xh0-Q4-60g" secondAttribute="bottom" constant="8" id="jpH-cn-dRV"/> <constraint firstItem="fNm-CZ-QXA" firstAttribute="top" secondItem="xh0-Q4-60g" secondAttribute="bottom" constant="8" id="jpH-cn-dRV"/>
<constraint firstItem="fhd-5r-dZW" firstAttribute="bottom" secondItem="B57-dd-H6T" secondAttribute="bottom" id="kh1-ra-tzR"/> <constraint firstItem="fhd-5r-dZW" firstAttribute="bottom" secondItem="B57-dd-H6T" secondAttribute="bottom" id="kh1-ra-tzR"/>
<constraint firstItem="pK8-Er-7VT" firstAttribute="trailing" secondItem="fhd-5r-dZW" secondAttribute="trailing" id="p7X-Rw-Fof"/>
<constraint firstItem="B57-dd-H6T" firstAttribute="top" secondItem="fhd-5r-dZW" secondAttribute="top" id="vGA-oo-EGc"/> <constraint firstItem="B57-dd-H6T" firstAttribute="top" secondItem="fhd-5r-dZW" secondAttribute="top" id="vGA-oo-EGc"/>
</constraints> </constraints>
<viewLayoutGuide key="safeArea" id="fhd-5r-dZW"/> <viewLayoutGuide key="safeArea" id="fhd-5r-dZW"/>
@@ -243,8 +260,144 @@
</objects> </objects>
<point key="canvasLocation" x="1613.5999999999999" y="278.41079460269867"/> <point key="canvasLocation" x="1613.5999999999999" y="278.41079460269867"/>
</scene> </scene>
<!--Communication Demo View Controller-->
<scene sceneID="3bp-PM-07G">
<objects>
<viewController storyboardIdentifier="CommunicationDemoViewController" id="yO7-0r-4b7" customClass="CommunicationDemoViewController" customModule="SampleSwift" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="FHY-Ep-cpp">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sonarpattern" translatesAutoresizingMaskIntoConstraints="NO" id="YeI-9y-VEp">
<rect key="frame" x="0.0" y="20" width="375" height="647"/>
</imageView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="5E7-VK-dne">
<rect key="frame" x="20" y="60" width="335" height="40"/>
<color key="backgroundColor" red="0.89411764709999997" green="0.87450980389999999" blue="0.92941176469999998" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="xck-oS-Neb"/>
</constraints>
<state key="normal" title="Trigger Notification">
<color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
</state>
<connections>
<action selector="tappedTriggerNotification:" destination="yO7-0r-4b7" eventType="touchUpInside" id="OuI-zu-JHb"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Communication Demo" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2rF-Jd-Trq">
<rect key="frame" x="98" y="120" width="179.5" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bLN-R7-u0M">
<rect key="frame" x="8" y="143" width="359" height="1"/>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="1" id="11x-tI-CnX"/>
<constraint firstAttribute="height" constant="1" id="nL6-Cd-c6p"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Send Message:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CYO-va-16f">
<rect key="frame" x="8" y="161.5" width="118" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="OXk-Zn-AOg">
<rect key="frame" x="134" y="152" width="233" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="Idx-di-XQN"/>
</constraints>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8av-mp-l2a">
<rect key="frame" x="20" y="208" width="335" height="40"/>
<color key="backgroundColor" red="0.89411764709999997" green="0.87450980389999999" blue="0.92941176469999998" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="0CI-UD-B3m"/>
</constraints>
<state key="normal" title="Send">
<color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="tappedSendMessage:" destination="yO7-0r-4b7" eventType="touchUpInside" id="2ID-pG-gA8"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Received Messages:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wxL-2d-XQT">
<rect key="frame" x="8" y="256" width="156.5" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" allowsSelection="NO" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="XUs-yJ-t0P">
<rect key="frame" x="0.0" y="285" width="375" height="382"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="sectionIndexBackgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="reusableCell" id="1Fb-os-QAl">
<rect key="frame" x="0.0" y="28" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="1Fb-os-QAl" id="K8f-VE-KE6">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="yO7-0r-4b7" id="qtm-Ss-KtS"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="2rF-Jd-Trq" firstAttribute="top" secondItem="5E7-VK-dne" secondAttribute="bottom" constant="20" id="0tb-DY-WPE"/>
<constraint firstItem="YeI-9y-VEp" firstAttribute="top" secondItem="5mO-nO-IPJ" secondAttribute="top" id="1id-kE-fi4"/>
<constraint firstItem="5mO-nO-IPJ" firstAttribute="trailing" secondItem="XUs-yJ-t0P" secondAttribute="trailing" id="7HK-Gf-9Of"/>
<constraint firstItem="bLN-R7-u0M" firstAttribute="leading" secondItem="5mO-nO-IPJ" secondAttribute="leading" constant="8" id="7oV-3N-HxG"/>
<constraint firstItem="XUs-yJ-t0P" firstAttribute="leading" secondItem="5mO-nO-IPJ" secondAttribute="leading" id="8Jf-Kc-tP9"/>
<constraint firstItem="8av-mp-l2a" firstAttribute="leading" secondItem="5mO-nO-IPJ" secondAttribute="leading" constant="20" id="Du4-Nv-hvu"/>
<constraint firstItem="5E7-VK-dne" firstAttribute="top" secondItem="5mO-nO-IPJ" secondAttribute="top" constant="40" id="Llm-r0-ENR"/>
<constraint firstItem="5mO-nO-IPJ" firstAttribute="trailing" secondItem="OXk-Zn-AOg" secondAttribute="trailing" constant="8" id="NLB-pB-BYb"/>
<constraint firstItem="5mO-nO-IPJ" firstAttribute="bottom" secondItem="XUs-yJ-t0P" secondAttribute="bottom" id="PDf-ih-mAF"/>
<constraint firstItem="CYO-va-16f" firstAttribute="leading" secondItem="5mO-nO-IPJ" secondAttribute="leading" constant="8" id="Q1i-Yi-9Rm"/>
<constraint firstItem="XUs-yJ-t0P" firstAttribute="top" secondItem="wxL-2d-XQT" secondAttribute="bottom" constant="8" id="RP2-g2-54L"/>
<constraint firstItem="5mO-nO-IPJ" firstAttribute="trailing" secondItem="8av-mp-l2a" secondAttribute="trailing" constant="20" id="VQh-bh-UwN"/>
<constraint firstItem="CYO-va-16f" firstAttribute="centerY" secondItem="OXk-Zn-AOg" secondAttribute="centerY" id="a5e-4f-EWY"/>
<constraint firstItem="5E7-VK-dne" firstAttribute="leading" secondItem="5mO-nO-IPJ" secondAttribute="leading" constant="20" id="b2g-cB-gif"/>
<constraint firstItem="2rF-Jd-Trq" firstAttribute="centerX" secondItem="FHY-Ep-cpp" secondAttribute="centerX" id="bjO-UN-1nu"/>
<constraint firstItem="5E7-VK-dne" firstAttribute="centerX" secondItem="FHY-Ep-cpp" secondAttribute="centerX" id="cKt-5n-Vg7"/>
<constraint firstItem="OXk-Zn-AOg" firstAttribute="leading" secondItem="CYO-va-16f" secondAttribute="trailing" constant="8" id="fEK-Ms-pZV"/>
<constraint firstItem="5mO-nO-IPJ" firstAttribute="trailing" secondItem="bLN-R7-u0M" secondAttribute="trailing" constant="8" id="grX-2b-Qhh"/>
<constraint firstItem="YeI-9y-VEp" firstAttribute="leading" secondItem="5mO-nO-IPJ" secondAttribute="leading" id="iPy-f9-gvc"/>
<constraint firstItem="8av-mp-l2a" firstAttribute="top" secondItem="OXk-Zn-AOg" secondAttribute="bottom" constant="16" id="ieE-xw-Ydg"/>
<constraint firstItem="2rF-Jd-Trq" firstAttribute="centerX" secondItem="FHY-Ep-cpp" secondAttribute="centerX" id="o3n-kC-QG7"/>
<constraint firstItem="5mO-nO-IPJ" firstAttribute="trailing" secondItem="5E7-VK-dne" secondAttribute="trailing" constant="20" id="otm-NF-s8T"/>
<constraint firstItem="5mO-nO-IPJ" firstAttribute="bottom" secondItem="YeI-9y-VEp" secondAttribute="bottom" id="qJt-5P-nV0"/>
<constraint firstItem="5mO-nO-IPJ" firstAttribute="trailing" secondItem="YeI-9y-VEp" secondAttribute="trailing" id="qKu-cq-r7g"/>
<constraint firstItem="OXk-Zn-AOg" firstAttribute="top" secondItem="bLN-R7-u0M" secondAttribute="bottom" constant="8" id="uYK-IL-RjF"/>
<constraint firstItem="bLN-R7-u0M" firstAttribute="top" secondItem="2rF-Jd-Trq" secondAttribute="bottom" constant="2" id="v9J-YM-ZKk"/>
<constraint firstItem="wxL-2d-XQT" firstAttribute="top" secondItem="8av-mp-l2a" secondAttribute="bottom" constant="8" id="x2E-zN-2Lf"/>
<constraint firstItem="wxL-2d-XQT" firstAttribute="leading" secondItem="CYO-va-16f" secondAttribute="leading" id="zqj-I4-0ft"/>
</constraints>
<viewLayoutGuide key="safeArea" id="5mO-nO-IPJ"/>
</view>
<navigationItem key="navigationItem" id="UeU-fc-r04"/>
<connections>
<outlet property="messageField" destination="OXk-Zn-AOg" id="Y7k-PD-sUg"/>
<outlet property="tableView" destination="XUs-yJ-t0P" id="g06-Hc-IC1"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="epO-9y-CS0" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1015" y="51"/>
</scene>
</scenes> </scenes>
<resources> <resources>
<image name="sonarpattern" width="843" height="1317"/> <image name="sonarpattern" width="421" height="658"/>
</resources> </resources>
</document> </document>