found the multipeer streaming bug and will now only target iOS 8 and higher, to remove this bug. Added segmented control to CurrentlyPlayingViewControl. Will add to song selection view later

This commit is contained in:
Okechi 2016-04-14 06:30:44 -04:00
parent 1e718c4297
commit d35e5b7df1
16 changed files with 639 additions and 134 deletions

View File

@ -11,7 +11,7 @@ import MediaPlayer
import AVFoundation
import MultipeerConnectivity
class CurrentlyPlayingViewController: UIViewController, PartyServiceManagerDelegate{
class CurrentlyPlayingViewController: UIViewController, PartyServiceManagerDelegate, UICollectionViewDataSource, UICollectionViewDelegate{
//persistant data
var party: PartyServiceManager!
var usr: [UserParseData] = []
@ -21,19 +21,97 @@ class CurrentlyPlayingViewController: UIViewController, PartyServiceManagerDeleg
var playing = true
var timer = NSTimer()
var nextHost: String!
@IBOutlet var segmentControl: UISegmentedControl!
//controller data
@IBAction func switchViews(segCtrl: UISegmentedControl){
if(segCtrl.selectedSegmentIndex == 0){
//hide all in party view elements
self.friendsInParty.hidden = true
self.leaveOrEnd.hidden = true
self.leaveOrEnd.enabled = false
self.addMore.hidden = true
self.addMore.enabled == true
//show all relevent current playing ui components
self.songImg.hidden = false
self.titleLabel.hidden = false
self.artistAndAlbumLabel.hidden = false
self.minLabel.hidden = false
self.maxLabel.hidden = false
self.progressBar.hidden = false
if(self.party.role == PeerType.Host_Creator || self.party.role == PeerType.Guest_Creator){
self.volCtrl.hidden == false
self.volCtrl.enabled = true
}
}
if(segCtrl.selectedSegmentIndex == 1){
//show all in party view elements
self.friendsInParty.hidden = false
self.leaveOrEnd.hidden = false
self.leaveOrEnd.enabled = true
if(self.party.role == PeerType.Host_Creator || self.party.role == PeerType.Guest_Creator){
self.addMore.hidden = false
self.addMore.enabled == true
}
//hide all relevent current playing ui components
self.songImg.hidden = true
self.titleLabel.hidden = true
self.artistAndAlbumLabel.hidden = true
self.minLabel.hidden = true
self.maxLabel.hidden = true
self.progressBar.hidden = true
self.volCtrl.hidden == true
self.volCtrl.enabled = false
}
}
//controller data for currently playing segment
@IBOutlet var songImg: UIImageView!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var artistAndAlbumLabel: UILabel!
@IBOutlet var minLabel: UILabel!
@IBOutlet var maxLabel: UILabel!
@IBOutlet var progressBar: UIProgressView!
//Host buttons
/*Host Buttons*/
@IBOutlet var volCtrl: UISlider!
@IBOutlet var ppfButton: UIButton!
//controller data for in party view
@IBOutlet var friendsInParty: UICollectionView!
@IBOutlet var leaveOrEnd: UIButton!
/*Host Buttons*/
@IBOutlet var addMore: UIButton!
//Action Methods for In Party View
//Only visible for host
@IBAction func inviteMore(sender: UIButton!){
}
//Alternates to either end a party or leave a party depending on host or guest role
@IBAction func endOrLeaveParty(sender: UIButton){
}
//Action Methods for Currently Playing View
@IBAction func volChng(sender: UISlider){
self.audioPlayer.volume = sender.value
}
@ -63,10 +141,6 @@ class CurrentlyPlayingViewController: UIViewController, PartyServiceManagerDeleg
}
//Guest buttons
override func viewDidLoad() {
@ -74,9 +148,24 @@ class CurrentlyPlayingViewController: UIViewController, PartyServiceManagerDeleg
// Do any additional setup after loading the view.
//set up for in party view
self.friendsInParty.dataSource = self
self.friendsInParty.delegate = self
self.friendsInParty.hidden = true
self.leaveOrEnd.hidden = true
self.leaveOrEnd.enabled = false
//Set up for CurrentlyPlayingView
self.progressBar.setProgress(0, animated: true)
self.volCtrl.hidden = true
self.volCtrl.enabled = false
if(self.party.role == PeerType.Host_Creator || self.party.role == PeerType.Guest_Creator){
self.volCtrl.hidden = false
self.volCtrl.enabled = true
self.audioPlayer = AVPlayer(URL: self.party.currentSong.valueForProperty(MPMediaItemPropertyAssetURL) as! NSURL)
self.songImg.image = self.party.currentSong.valueForProperty(MPMediaItemPropertyArtwork).imageWithSize(songImg.frame.size)
@ -100,6 +189,8 @@ class CurrentlyPlayingViewController: UIViewController, PartyServiceManagerDeleg
//NSNotificationCenter.defaultCenter().addObserver(self, selector: "songDidEnd:", name: "AVPlayerItemDidPlayToEndTimeNotification", object: nil)
}else if (self.party.role == PeerType.Guest_Invited || self.party.role == PeerType.Host_Invited){
self.volCtrl.hidden = true
self.volCtrl.enabled = false
self.songImg.image = self.party.currentSongIMG
self.titleLabel.text = (self.party.currentSongTitle)
@ -113,6 +204,11 @@ class CurrentlyPlayingViewController: UIViewController, PartyServiceManagerDeleg
}
override func viewDidAppear(animated: Bool) {
//make this part check which view to display later
}
func songDidEnd(notification: NSNotification){
@ -229,6 +325,43 @@ class CurrentlyPlayingViewController: UIViewController, PartyServiceManagerDeleg
}
//collection view methods
extension CurrentlyPlayingViewController {
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell: InvitedCollectionViewCell!
let friend = self.party.invitedFriends[indexPath.row]
cell = self.friendsInParty.dequeueReusableCellWithReuseIdentifier("InvitedCollectionCell", forIndexPath: indexPath) as! InvitedCollectionViewCell
if friend.profileImg == nil {
cell.friendImage.backgroundColor = UIColor.grayColor()
}
else{
cell.friendImage.image = friend.profileImg.image!
}
//rounds uiimage and configures UIImageView
cell.friendImage.layer.cornerRadius = cell.friendImage.frame.size.width/2
cell.friendImage.clipsToBounds = true
return cell
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.party.invitedFriends.count
}
}
extension CurrentlyPlayingViewController: PartyServiceManagerDelegate {
func foundPeer() {
@ -266,23 +399,35 @@ extension CurrentlyPlayingViewController: PartyServiceManagerDelegate {
}else if(instruction == "want_to_be_host"){
let alert = UIAlertController(title: "Hosting Request", message: "Would you like to be the next host for the party and pick a song?", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Accept", style: .Default, handler:{
(action: UIAlertAction!) -> Void in
if objc_getClass("UIAlertController") != nil {
self.party.currentHost = self.party.myPeerID.displayName
alert.dismissViewControllerAnimated(true, completion: nil)
let alert = UIAlertController(title: "Hosting Request", message: "Would you like to be the next host for the party and pick a song?", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Accept", style: .Default, handler:{
(action: UIAlertAction!) -> Void in
self.party.currentHost = self.party.myPeerID.displayName
alert.dismissViewControllerAnimated(true, completion: nil)
}))
}))
alert.addAction(UIAlertAction(title: "Decline", style: .Default, handler:{
(action: UIAlertAction!) -> Void in
var dictionary: [String: AnyObject] = ["sender": self.party.myPeerID, "instruction": "does_not_accept"]
self.party.sendInstruction(dictionary, toPeer: fromPeer)
alert.dismissViewControllerAnimated(true, completion: nil)
}))
self.presentViewController(alert, animated: true, completion: nil)
alert.addAction(UIAlertAction(title: "Decline", style: .Default, handler:{
(action: UIAlertAction!) -> Void in
var dictionary: [String: AnyObject] = ["sender": self.party.myPeerID, "instruction": "does_not_accept"]
self.party.sendInstruction(dictionary, toPeer: fromPeer)
alert.dismissViewControllerAnimated(true, completion: nil)
}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Password Changed"
alert.message = "Your password has been updated."
alert.addButtonWithTitle("Yes")
alert.addButtonWithTitle("No")
alert.show()
}
}else if(instruction == "start_picking_a_song"){
if(self.party.role == PeerType.Host_Invited){

View File

@ -53,10 +53,23 @@ class FriendRequestViewController: UIViewController{
(succeeded, error) -> Void in
if(succeeded){
var alert = UIAlertController(title: "Request Sent!", message: "Your friend request was sent successfully!", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
var alert = UIAlertController(title: "Request Sent!", message: "Your friend request was sent successfully!", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Request Sent!"
alert.message = "Your friend request was sent successfully!"
alert.addButtonWithTitle("OK")
alert.show()
}
println(friendRequest.objectId!)
var params = NSMutableDictionary()
@ -151,9 +164,25 @@ extension FriendRequestViewController: UITextFieldDelegate{
if(self.searchedEmail == (self.tabBarController as! HomeTabController).userData[0].email){
let alert = UIAlertController(title: "That's You!", message: "Sorry, you can't send a request to yourself.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(title: "That's You!", message: "Sorry, you can't send a request to yourself.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "That's You!"
alert.message = "Sorry, you can't send a request to yourself."
alert.addButtonWithTitle("OK")
alert.show()
}
}
else if(inFriendsList == false){
@ -199,19 +228,47 @@ extension FriendRequestViewController: UITextFieldDelegate{
})
}else{
let alert = UIAlertController(title: "Request Already Made", message: "You have already sent a friend request to this user.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(title: "Request Already Made!", message: "You have already sent a friend request to this user.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Request Already Made!"
alert.message = "You have already sent a friend request to this user."
alert.addButtonWithTitle("OK")
alert.show()
}
}
})
})
}else{
let alert = UIAlertController(title: "Already Friends", message: "You are already friends with this user!", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(title: "Already Friends!", message: "You are already friends with this user!", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Already Friends!"
alert.message = "You are already friends with this user!"
alert.addButtonWithTitle("OK")
alert.show()
}
}

View File

@ -139,6 +139,11 @@ class HomeScreenViewController: UIViewController, PartyServiceManagerDelegate {
//initialize host role
self.partyData.setRole(PeerType(rawValue: 0)!)
//remove fake peers that would appear in list if a peer that is found disconnects before entering invite screen
vc.setData(self.userData, frndData: self.friendData, party: self.partyData, request: self.requestData)

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x",
"filename" : "Background photo.png"
},
{
"idiom" : "universal",
"scale" : "2x",
"filename" : "Background photo@2x.png"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -35,7 +35,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>3</string>
<string>4</string>
<key>FacebookAppID</key>
<string>1166375230058840</string>
<key>FacebookDisplayName</key>

View File

@ -23,13 +23,21 @@ class InvitedToPartyViewController: UIViewController , PartyServiceManagerDelega
@IBAction func declineInvite(sender: UIButton){
self.inviteHandle(false, self.partyData.session)
self.shouldEndInvite = true
self.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func acceptInvite(sender: UIButton){
self.partyData.currentHost = self.fromPeer.displayName
self.inviteHandle(true, self.partyData.session)
self.shouldEndInvite = true
self.performSegueWithIdentifier("JoiningPartySegue", sender: self)
/*self.dismissViewControllerAnimated(true, completion: {
() -> Void in
})*/
}
override func viewDidLoad() {

View File

@ -105,11 +105,19 @@ extension JoiningPartyViewController: PartyServiceManagerDelegate {
if (instruction == "start_party"){
println("mark 4")
println("mark 4: start party")
//var microDelay = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("doIt"), userInfo: nil, repeats: false)
self.performSegueWithIdentifier("EnteringPartySegue", sender: self)
println("micro-triggered")
}
}
func doIt(){
self.performSegueWithIdentifier("EnteringPartySegue", sender: self)
println("triggered")
}
}

View File

@ -91,6 +91,7 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource,
var dictionary: [String: String] = ["sender": self.party.myPeerID.displayName, "instruction": "start_party"]
for peer in self.party.session.connectedPeers as! [MCPeerID] {
println("start_party_from_host")
self.party.sendInstruction(dictionary, toPeer: peer )
}
@ -100,7 +101,7 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource,
func attemptToStart(){
/*
for peer in self.party.session.connectedPeers as! [MCPeerID] {
if self.arePeersReady[peer.displayName] == false{
@ -108,7 +109,7 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource,
self.party.sendInstruction(dictionary, toPeer: peer)
}
}
*/
var delTimer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: Selector("startParty"), userInfo: nil, repeats: false)

View File

@ -41,25 +41,71 @@ class LoginController: UIViewController, PFLogInViewControllerDelegate, UITextFi
self.presentViewController(tabBarController, animated: true, completion: nil)
}else{
var alert = UIAlertController(title: "Invalid Login", message: "Invalid email or password", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
//for ios 7 and lower compatibility
self.presentViewController(alert, animated: true, completion: nil)
if objc_getClass("UIAlertController") != nil {
var alert = UIAlertController(title: "Invalid Login", message: "Invalid email or password", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Invalid Login"
alert.message = "Invalid email or password"
alert.addButtonWithTitle("OK")
alert.show()
}
}
})
}else{
var alert = UIAlertController(title: "Invalid Login", message: "Invalid email or password", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
var alert = UIAlertController(title: "Invalid Login", message: "Invalid email or password", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Invalid Login"
alert.message = "Invalid email or password"
alert.addButtonWithTitle("OK")
alert.show()
}
}
})
})
}else{
var alert = UIAlertController(title: "Invalid Login", message: "Invalid email or password", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
/*
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
var alert = UIAlertController(title: "Invalid Login", message: "Invalid email or password", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Invalid Login"
alert.message = "Invalid email or password"
alert.addButtonWithTitle("OK")
alert.show()
}
/*
PFUser.logInWithUsernameInBackground(userEmailField.text!, password: password.text!, block: {
(user, error) -> Void in

View File

@ -522,17 +522,17 @@
<viewControllerLayoutGuide type="bottom" id="TbO-r5-p5C"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="7j0-GI-WEY">
<rect key="frame" x="0.0" y="0.0" width="320" height="519"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="dcC-PI-dUM">
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="dcC-PI-dUM">
<rect key="frame" x="92" y="172" width="137" height="137"/>
<color key="backgroundColor" red="0.47790404040000001" green="0.47790404040000001" blue="0.47790404040000001" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="width" secondItem="dcC-PI-dUM" secondAttribute="height" multiplier="1:1" id="k78-9a-PzH"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No Friend Found :(" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wxx-ws-paN">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="No Friend Found :(" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wxx-ws-paN">
<rect key="frame" x="16" y="143" width="288" height="21"/>
<constraints>
<constraint firstAttribute="width" secondItem="wxx-ws-paN" secondAttribute="height" multiplier="96:7" id="01G-k4-5I5"/>
@ -541,7 +541,7 @@
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Search for a new Friend" textAlignment="center" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="EAo-0U-cmz">
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Search for a new Friend" textAlignment="center" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="EAo-0U-cmz">
<rect key="frame" x="0.0" y="64" width="320" height="30"/>
<constraints>
<constraint firstAttribute="width" secondItem="EAo-0U-cmz" secondAttribute="height" multiplier="32:3" id="9iE-5D-OrP"/>
@ -552,7 +552,7 @@
<action selector="buttonClicked:" destination="Iog-DT-pLJ" eventType="editingDidEnd" id="Xrc-To-w28"/>
</connections>
</textField>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Gck-Ni-mM6">
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Gck-Ni-mM6">
<rect key="frame" x="61" y="324" width="198" height="41"/>
<constraints>
<constraint firstAttribute="width" secondItem="Gck-Ni-mM6" secondAttribute="height" multiplier="198:41" id="MBZ-mJ-aEE"/>
@ -598,7 +598,7 @@
<objects>
<tableViewController title="Friend Requests" id="Rnb-lz-mp4" customClass="PendingRequestViewController" customModule="GetHip" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="6eb-it-ynj">
<rect key="frame" x="0.0" y="0.0" width="320" height="519"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
@ -670,10 +670,10 @@
<viewControllerLayoutGuide type="bottom" id="qXi-L8-LDL"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="XPu-Tq-bas">
<rect key="frame" x="0.0" y="0.0" width="320" height="519"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="NoNewFriends" translatesAutoresizingMaskIntoConstraints="NO" id="W0g-0K-j03">
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" image="NoNewFriends" translatesAutoresizingMaskIntoConstraints="NO" id="W0g-0K-j03">
<rect key="frame" x="0.0" y="20" width="291" height="499"/>
<constraints>
<constraint firstAttribute="width" secondItem="W0g-0K-j03" secondAttribute="height" multiplier="80:137" id="q9x-EZ-Z0h"/>
@ -816,10 +816,10 @@
<viewControllerLayoutGuide type="bottom" id="cK5-oC-1To"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="jS0-Hf-zMc">
<rect key="frame" x="0.0" y="0.0" width="320" height="519"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="Bxz-d2-wT5">
<tableView clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="Bxz-d2-wT5">
<rect key="frame" x="0.0" y="64" width="289" height="455"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
@ -961,6 +961,9 @@
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="BackgroundPhoto" translatesAutoresizingMaskIntoConstraints="NO" id="FBz-zN-bDA">
<rect key="frame" x="0.0" y="20" width="320" height="548"/>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="HomeScreenTurnTable" translatesAutoresizingMaskIntoConstraints="NO" id="Ugh-Mp-5Vj">
<rect key="frame" x="104" y="207" width="112" height="112"/>
<constraints>
@ -1022,7 +1025,6 @@
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.81104008838383834" green="0.81104008838383834" blue="0.81104008838383834" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="8gk-cL-0Zc" firstAttribute="trailing" secondItem="TKW-IF-c3d" secondAttribute="trailingMargin" id="3lz-pY-pnh"/>
<constraint firstItem="iPz-hc-0g2" firstAttribute="top" secondItem="Ugh-Mp-5Vj" secondAttribute="bottom" constant="139" id="4Oj-H9-86a"/>
@ -1098,10 +1100,10 @@
<viewControllerLayoutGuide type="bottom" id="y0v-Q6-Get"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="ctw-5J-FC7">
<rect key="frame" x="0.0" y="0.0" width="320" height="519"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Y2n-eR-fV3">
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Y2n-eR-fV3">
<rect key="frame" x="0.0" y="485" width="320" height="34"/>
<color key="backgroundColor" red="1" green="0.18659413420000001" blue="0.1031019395" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
@ -1115,7 +1117,7 @@
<action selector="logOutUser:" destination="hze-Wf-sBw" eventType="touchUpInside" id="MFy-sD-OVE"/>
</connections>
</button>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="Fdh-6Y-dZF">
<tableView clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="Fdh-6Y-dZF">
<rect key="frame" x="0.0" y="64" width="320" height="421"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
@ -1660,12 +1662,12 @@
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="Ahn-du-dnu" firstAttribute="top" secondItem="uLS-vF-X15" secondAttribute="bottom" constant="1" id="0N9-hz-15R"/>
<constraint firstAttribute="trailingMargin" secondItem="m2x-Bt-FQ4" secondAttribute="trailing" constant="63" id="1bW-oI-ZYa"/>
<constraint firstItem="m2x-Bt-FQ4" firstAttribute="top" secondItem="Ahn-du-dnu" secondAttribute="bottom" constant="8" id="hIL-Kp-YHG"/>
<constraint firstItem="Ahn-du-dnu" firstAttribute="top" secondItem="uLS-vF-X15" secondAttribute="bottom" constant="1" id="mS1-1Z-TRK"/>
<constraint firstAttribute="trailingMargin" secondItem="Ahn-du-dnu" secondAttribute="trailing" constant="-16" id="mut-U2-HZa"/>
<constraint firstItem="Tzv-Vd-uaH" firstAttribute="leading" secondItem="Qhp-1X-VsE" secondAttribute="leadingMargin" constant="-16" id="o8K-iS-oaT"/>
<constraint firstItem="hSQ-bx-ISt" firstAttribute="top" secondItem="Tzv-Vd-uaH" secondAttribute="bottom" id="pXq-1d-af6"/>
<constraint firstItem="hSQ-bx-ISt" firstAttribute="top" secondItem="Tzv-Vd-uaH" secondAttribute="bottom" id="v2z-tw-NaM"/>
<constraint firstItem="Ahn-du-dnu" firstAttribute="leading" secondItem="Qhp-1X-VsE" secondAttribute="leadingMargin" constant="-16" id="yZo-Vr-FQg"/>
<constraint firstAttribute="trailingMargin" secondItem="Tzv-Vd-uaH" secondAttribute="trailing" constant="-16" id="yof-4d-HNw"/>
<constraint firstItem="m2x-Bt-FQ4" firstAttribute="leading" secondItem="Qhp-1X-VsE" secondAttribute="leadingMargin" constant="73" id="zVN-Nb-I90"/>
@ -1781,14 +1783,14 @@
<viewControllerLayoutGuide type="top" id="BJ6-Uk-a0g"/>
<viewControllerLayoutGuide type="bottom" id="JcA-Xl-P8T"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="7bf-oI-myh">
<view key="view" contentMode="scaleToFill" id="7bf-oI-myh" userLabel="CurrentlyPlayingView">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="HKj-kH-yf5">
<rect key="frame" x="0.0" y="65" width="320" height="320"/>
</imageView>
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ubi-iW-9FF">
<button hidden="YES" opaque="NO" contentMode="scaleToFill" misplaced="YES" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ubi-iW-9FF">
<rect key="frame" x="13" y="23" width="34" height="34"/>
<state key="normal" image="HomeButton">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
@ -1846,7 +1848,7 @@
</attributedString>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sFb-YR-QlX">
<button hidden="YES" opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sFb-YR-QlX">
<rect key="frame" x="138" y="505" width="44" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="4M8-GN-Scr"/>
@ -1859,7 +1861,7 @@
<action selector="playPauseFav:" destination="5Fd-vs-lX1" eventType="touchUpInside" id="AgY-Dl-2AA"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="V0r-OV-CXi">
<button hidden="YES" opaque="NO" contentMode="scaleToFill" misplaced="YES" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="V0r-OV-CXi">
<rect key="frame" x="226" y="16" width="81" height="41"/>
<state key="normal" image="Party.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
@ -1868,8 +1870,18 @@
<segue destination="enX-CI-fki" kind="show" identifier="InPartySegue" id="OD2-Xh-xf2"/>
</connections>
</button>
<slider opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="AA9-Xx-q9o">
<rect key="frame" x="26" y="467" width="268" height="31"/>
<segmentedControl opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="bIT-Ad-e2w">
<rect key="frame" x="71" y="26" width="178" height="29"/>
<segments>
<segment title="Now Playing"/>
<segment title="Party"/>
</segments>
<connections>
<action selector="switchViews:" destination="5Fd-vs-lX1" eventType="valueChanged" id="DpK-83-IDj"/>
</connections>
</segmentedControl>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="AA9-Xx-q9o">
<rect key="frame" x="26" y="493" width="268" height="31"/>
<connections>
<action selector="volChng:" destination="5Fd-vs-lX1" eventType="valueChanged" id="hT1-f1-qOr"/>
</connections>
@ -1880,12 +1892,72 @@
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" ambiguous="YES" misplaced="YES" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="bSg-YD-Rue">
<rect key="frame" x="0.0" y="65" width="320" height="267"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="width" secondItem="bSg-YD-Rue" secondAttribute="height" multiplier="320:267" id="Gjt-Oa-8va"/>
</constraints>
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="vei-3y-zSv">
<size key="itemSize" width="50" height="50"/>
<size key="headerReferenceSize" width="0.0" height="0.0"/>
<size key="footerReferenceSize" width="0.0" height="0.0"/>
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
</collectionViewFlowLayout>
<cells>
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="InvitedCollectionCell" id="1QD-jt-w32" customClass="InvitedCollectionViewCell" customModule="GetHip" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="50" height="50"/>
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="50" height="50"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ALq-LP-nht">
<rect key="frame" x="6" y="6" width="38" height="38"/>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<connections>
<outlet property="friendImage" destination="ALq-LP-nht" id="RJs-nq-uUI"/>
</connections>
</collectionViewCell>
</cells>
</collectionView>
<button opaque="NO" contentMode="scaleToFill" ambiguous="YES" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pge-W4-NsC">
<rect key="frame" x="0.0" y="527" width="320" height="41"/>
<color key="backgroundColor" red="0.98431372549999996" green="0.08235294118" blue="0.086274509799999996" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="width" secondItem="pge-W4-NsC" secondAttribute="height" multiplier="320:41" id="6yz-lB-IaB"/>
</constraints>
<state key="normal" title="End Party">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="endOrLeaveParty:" destination="5Fd-vs-lX1" eventType="touchUpInside" id="dGk-p3-5ei"/>
<action selector="endOrLeaveParty:" destination="TaI-jj-ubR" eventType="touchUpInside" id="yXl-KL-7jf"/>
</connections>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" ambiguous="YES" misplaced="YES" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xJP-qe-YBr" userLabel="AddMore">
<rect key="frame" x="84" y="340" width="152" height="38"/>
<constraints>
<constraint firstAttribute="width" secondItem="xJP-qe-YBr" secondAttribute="height" multiplier="4:1" id="PPB-YP-Owd"/>
</constraints>
<state key="normal" image="AddMore">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="inviteMore:" destination="5Fd-vs-lX1" eventType="touchUpInside" id="SKw-Du-0yT"/>
<action selector="inviteMore:" destination="TaI-jj-ubR" eventType="touchUpInside" id="anf-lP-zfA"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="HKj-kH-yf5" firstAttribute="top" secondItem="V0r-OV-CXi" secondAttribute="bottom" constant="8" symbolic="YES" id="1f2-Oz-Fi0"/>
<constraint firstItem="80y-aA-luy" firstAttribute="top" secondItem="wy0-d1-PlB" secondAttribute="bottom" constant="8" symbolic="YES" id="5kl-bq-Azu"/>
<constraint firstItem="AA9-Xx-q9o" firstAttribute="leading" secondItem="7bf-oI-myh" secondAttribute="leadingMargin" constant="12" id="73k-rN-bjC"/>
<constraint firstItem="xJP-qe-YBr" firstAttribute="width" secondItem="xJP-qe-YBr" secondAttribute="height" multiplier="4:1" id="7wz-k1-8es"/>
<constraint firstAttribute="bottom" secondItem="sFb-YR-QlX" secondAttribute="bottom" constant="20" symbolic="YES" id="8VO-gH-EZL"/>
<constraint firstItem="HKj-kH-yf5" firstAttribute="leading" secondItem="wy0-d1-PlB" secondAttribute="leading" id="Dic-3j-ogH"/>
<constraint firstItem="tHQ-qY-ZrL" firstAttribute="leading" secondItem="7bf-oI-myh" secondAttribute="leadingMargin" constant="34" id="Dop-xA-dVi"/>
@ -1893,6 +1965,7 @@
<constraint firstItem="okD-F3-qgw" firstAttribute="firstBaseline" secondItem="80y-aA-luy" secondAttribute="firstBaseline" id="PBX-NR-n4E"/>
<constraint firstItem="80y-aA-luy" firstAttribute="baseline" secondItem="okD-F3-qgw" secondAttribute="baseline" id="TeW-85-jI3"/>
<constraint firstItem="HKj-kH-yf5" firstAttribute="top" secondItem="Ubi-iW-9FF" secondAttribute="bottom" constant="8" symbolic="YES" id="UAR-ml-sXd"/>
<constraint firstItem="bSg-YD-Rue" firstAttribute="width" secondItem="bSg-YD-Rue" secondAttribute="height" multiplier="320:267" id="W82-6R-uTN"/>
<constraint firstItem="VtF-OO-Edp" firstAttribute="centerX" secondItem="tHQ-qY-ZrL" secondAttribute="centerX" id="YlO-ZD-CTv"/>
<constraint firstAttribute="trailing" secondItem="HKj-kH-yf5" secondAttribute="trailing" id="Ytf-ZW-PNh"/>
<constraint firstItem="Ubi-iW-9FF" firstAttribute="top" secondItem="BJ6-Uk-a0g" secondAttribute="bottom" constant="3" id="b5P-n6-icr"/>
@ -1900,9 +1973,10 @@
<constraint firstItem="80y-aA-luy" firstAttribute="leading" secondItem="VtF-OO-Edp" secondAttribute="leading" id="bgF-1V-TXG"/>
<constraint firstItem="sFb-YR-QlX" firstAttribute="centerX" secondItem="AA9-Xx-q9o" secondAttribute="centerX" id="egj-qz-WMw"/>
<constraint firstItem="tHQ-qY-ZrL" firstAttribute="top" secondItem="wy0-d1-PlB" secondAttribute="bottom" constant="28" id="eqR-DO-mCO"/>
<constraint firstItem="sFb-YR-QlX" firstAttribute="top" secondItem="AA9-Xx-q9o" secondAttribute="bottom" constant="10" id="f6k-bf-Hjd"/>
<constraint firstItem="sFb-YR-QlX" firstAttribute="top" secondItem="AA9-Xx-q9o" secondAttribute="bottom" constant="-18" id="f6k-bf-Hjd"/>
<constraint firstItem="wy0-d1-PlB" firstAttribute="trailing" secondItem="HKj-kH-yf5" secondAttribute="trailing" id="fK4-el-P6H"/>
<constraint firstItem="Ubi-iW-9FF" firstAttribute="leading" secondItem="7bf-oI-myh" secondAttribute="leadingMargin" constant="-3" id="m8z-GB-VTj"/>
<constraint firstItem="pge-W4-NsC" firstAttribute="width" secondItem="pge-W4-NsC" secondAttribute="height" multiplier="320:41" id="oHD-sy-sJV"/>
<constraint firstItem="AA9-Xx-q9o" firstAttribute="centerX" secondItem="VtF-OO-Edp" secondAttribute="centerX" id="oaR-p8-zAl"/>
<constraint firstItem="wy0-d1-PlB" firstAttribute="leading" secondItem="7bf-oI-myh" secondAttribute="leading" id="pYa-e5-3Xz"/>
<constraint firstItem="VtF-OO-Edp" firstAttribute="top" secondItem="tHQ-qY-ZrL" secondAttribute="bottom" constant="8" symbolic="YES" id="pbd-G1-waB"/>
@ -1910,16 +1984,20 @@
<constraint firstItem="VtF-OO-Edp" firstAttribute="trailing" secondItem="okD-F3-qgw" secondAttribute="trailing" id="q2y-fs-r3X"/>
<constraint firstItem="V0r-OV-CXi" firstAttribute="trailing" secondItem="okD-F3-qgw" secondAttribute="trailing" id="s1s-pc-EjA"/>
<constraint firstItem="80y-aA-luy" firstAttribute="top" secondItem="HKj-kH-yf5" secondAttribute="bottom" constant="8" symbolic="YES" id="wAB-iu-GqH"/>
<constraint firstItem="AA9-Xx-q9o" firstAttribute="top" secondItem="VtF-OO-Edp" secondAttribute="bottom" constant="2" id="xU9-Bq-wZ8"/>
<constraint firstItem="AA9-Xx-q9o" firstAttribute="top" secondItem="VtF-OO-Edp" secondAttribute="bottom" constant="30" id="xU9-Bq-wZ8"/>
</constraints>
</view>
<simulatedScreenMetrics key="simulatedDestinationMetrics" type="retina4"/>
<connections>
<outlet property="addMore" destination="xJP-qe-YBr" id="Hlf-HC-mMf"/>
<outlet property="artistAndAlbumLabel" destination="VtF-OO-Edp" id="qtZ-o0-88p"/>
<outlet property="friendsInParty" destination="bSg-YD-Rue" id="j7k-YV-vJh"/>
<outlet property="leaveOrEnd" destination="pge-W4-NsC" id="iGR-ky-UUU"/>
<outlet property="maxLabel" destination="okD-F3-qgw" id="hUU-67-4zW"/>
<outlet property="minLabel" destination="80y-aA-luy" id="cze-2A-X7w"/>
<outlet property="ppfButton" destination="sFb-YR-QlX" id="POG-Fe-CTk"/>
<outlet property="progressBar" destination="wy0-d1-PlB" id="tz6-o2-Q21"/>
<outlet property="segmentControl" destination="bIT-Ad-e2w" id="WCy-qF-hc1"/>
<outlet property="songImg" destination="HKj-kH-yf5" id="UAh-IG-J3y"/>
<outlet property="titleLabel" destination="tHQ-qY-ZrL" id="RE7-2e-ghS"/>
<outlet property="volCtrl" destination="AA9-Xx-q9o" id="3yD-gc-O6r"/>
@ -1943,7 +2021,7 @@
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="iAI-5U-c8e">
<tableView clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="iAI-5U-c8e">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
@ -2086,10 +2164,10 @@
<viewControllerLayoutGuide type="bottom" id="pFl-GS-eCQ"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="KfJ-hO-Coi">
<rect key="frame" x="0.0" y="0.0" width="320" height="519"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DUZ-CH-9De">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" usesAttributedText="YES" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DUZ-CH-9De">
<rect key="frame" x="16" y="93" width="288" height="21"/>
<constraints>
<constraint firstAttribute="width" secondItem="DUZ-CH-9De" secondAttribute="height" multiplier="96:7" id="D5l-U9-Cwp"/>
@ -2105,7 +2183,7 @@
</attributedString>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Display Name" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="Wsu-ex-aIi">
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Display Name" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="Wsu-ex-aIi">
<rect key="frame" x="16" y="155" width="288" height="30"/>
<constraints>
<constraint firstAttribute="width" secondItem="Wsu-ex-aIi" secondAttribute="height" multiplier="48:5" id="DAC-eX-OxF"/>
@ -2113,7 +2191,7 @@
<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="cxu-0g-kfY">
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cxu-0g-kfY">
<rect key="frame" x="59" y="269" width="202" height="30"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
@ -2160,10 +2238,10 @@
<viewControllerLayoutGuide type="bottom" id="xK7-iE-TXj"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="yqM-qv-Rad">
<rect key="frame" x="0.0" y="0.0" width="320" height="519"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kND-vl-jfb">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" usesAttributedText="YES" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kND-vl-jfb">
<rect key="frame" x="16" y="119" width="288" height="21"/>
<constraints>
<constraint firstAttribute="width" secondItem="kND-vl-jfb" secondAttribute="height" multiplier="96:7" id="kTH-Yf-T3L"/>
@ -2179,7 +2257,7 @@
</attributedString>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Email" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="SQN-vW-9hd">
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Email" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="SQN-vW-9hd">
<rect key="frame" x="16" y="183" width="288" height="30"/>
<constraints>
<constraint firstAttribute="width" secondItem="SQN-vW-9hd" secondAttribute="height" multiplier="48:5" id="fIC-8o-8dT"/>
@ -2187,7 +2265,7 @@
<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="bkf-Kj-gkm">
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bkf-Kj-gkm">
<rect key="frame" x="59" y="269" width="202" height="30"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
@ -2235,7 +2313,7 @@
<viewControllerLayoutGuide type="bottom" id="YHW-O3-1cu"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="2yd-eF-hW1">
<rect key="frame" x="0.0" y="0.0" width="320" height="519"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="48l-nw-nWb">
@ -2293,7 +2371,7 @@
<viewControllerLayoutGuide type="bottom" id="mWP-vZ-sRS"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="ptI-d3-Ike">
<rect key="frame" x="0.0" y="0.0" width="320" height="519"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VRa-oD-Myj">
@ -2327,6 +2405,7 @@
<resources>
<image name="Accept.png" width="28" height="28"/>
<image name="AddMore" width="198" height="33"/>
<image name="BackgroundPhoto" width="375" height="667"/>
<image name="Cancel" width="414" height="53"/>
<image name="Cancel.png" width="28" height="28"/>
<image name="ChangeSong" width="198" height="32"/>
@ -2351,10 +2430,10 @@
<image name="XMark" width="38" height="38"/>
</resources>
<inferredMetricsTieBreakers>
<segue reference="bZG-mB-VR5"/>
<segue reference="4Cw-Wg-nXy"/>
<segue reference="e9T-hD-upE"/>
<segue reference="V9M-LI-d3d"/>
<segue reference="3Qh-V2-6Ee"/>
<segue reference="Imp-mG-tFc"/>
<segue reference="hjX-RT-64R"/>
<segue reference="OpG-wQ-NAH"/>
<segue reference="45l-um-hHv"/>
</inferredMetricsTieBreakers>
</document>

View File

@ -161,6 +161,7 @@ class PartyServiceManager: NSObject, AnyObject {
if (instruction == "are_you_ready"){
var ready = true
println("guest is ready")
for peer in dataDictionary["connectedPeers"] as! [MCPeerID] {
if (self.connectedPeersDictionary[peer.displayName] == nil) && (peer != self.myPeerID) {
ready = false
@ -256,7 +257,7 @@ class PartyServiceManager: NSObject, AnyObject {
//Host Methods
func initializeSession(){
self.session = MCSession(peer: self.myPeerID, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.Required)
self.session = MCSession(peer: self.myPeerID)//, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.Required)
self.session.delegate = self
println("Initialized Peer-To-Peer Connection")
}
@ -305,9 +306,29 @@ extension PartyServiceManager: MCNearbyServiceBrowserDelegate{
if(!isPeerFound(peerID)){
if(peerID.displayName != self.myPeerID.displayName) {
NSLog("%@", "foundPeer: \(peerID)")
self.foundPeers.append(peerID)
self.delegate?.foundPeer()
//self.serviceBrowser.invitePeer(peerID, toSession: self.session, withContext: nil, timeout: NSTimeInterval(60.00))
/*
//compare hash values of the 2 peer ids
if(UInt32(self.myPeerID.hash) > UInt32(peerID.hash)){
}
/*
*/
if(isPeerFound(peerID)){
for(index, aPeer) in enumerate(foundPeers) {
if aPeer.displayName == peerID.displayName{
foundPeers[index] = peerID
break
}
}
}else{
*/
self.foundPeers.append(peerID)
//disconnectedPeersDictionary[peerID.displayName]
self.delegate?.foundPeer()
//self.serviceBrowser.invitePeer(peerID, toSession: self.session, withContext: nil, timeout: NSTimeInterval(60.00))
/*
}*/
}
@ -324,6 +345,8 @@ extension PartyServiceManager: MCNearbyServiceBrowserDelegate{
for(index, aPeer) in enumerate(foundPeers) {
if aPeer == peerID{
foundPeers.removeAtIndex(index)
//disconnectedPeersDictionary[peerID.displayName] = peerID
self.invitableCount--
break
}
}
@ -371,8 +394,8 @@ extension PartyServiceManager: MCSessionDelegate{
}
func session(session: MCSession!, didReceiveData data: NSData!, fromPeer peerID: MCPeerID!) {
NSLog("%@", "didRecieveData: \(data)")
//NSLog("%@", "didRecieveData: \(data)")
println("recieved data")
let dictionary: [String: AnyObject] = ["data": data, "fromPeer": peerID]
self.delegate?.didRecieveInstruction(dictionary)
@ -399,6 +422,12 @@ extension PartyServiceManager: MCSessionDelegate{
NSLog("%@", "didStartReceivingResourceWithName: \(resourceName) from peer: \(peerID)")
}
func session(session: MCSession!, didReceiveCertificate certificate: [AnyObject]!, fromPeer peerID: MCPeerID!, certificateHandler: ((Bool) -> Void)!) {
if(certificateHandler != nil){
certificateHandler(true)
}
}
}

View File

@ -199,10 +199,23 @@ class ResetPassDetailViewController: UIViewController {
obj.save()
let alert = UIAlertController(title: "Password Changed", message: "Your password has been updated", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(title: "Password Changed", message: "Your password has been updated.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Password Changed"
alert.message = "Your password has been updated."
alert.addButtonWithTitle("OK")
alert.show()
}
}
@ -210,9 +223,23 @@ class ResetPassDetailViewController: UIViewController {
} else {
let alert = UIAlertController(title: "Incorrect Password", message: "The password you gave as your current password was incorrect. Please enter the correct password.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(title: "Incorrect Password", message: "The password you gave as your current password was incorrect. Please enter the correct password.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Incorrect Password"
alert.message = "The password you gave as your current password was incorrect. Please enter the correct password."
alert.addButtonWithTitle("OK")
alert.show()
}
}
}
}
@ -234,7 +261,7 @@ class ResetPassDetailViewController: UIViewController {
}
}
class ProfileDetailViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
class ProfileDetailViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIActionSheetDelegate {
var profileImg: UIImageView!
private var picker = UIImagePickerController()
@ -244,32 +271,46 @@ class ProfileDetailViewController: UIViewController, UINavigationControllerDeleg
@IBAction func changePhoto(sender: UIButton) {
let captureMenu = UIAlertController(title: nil, message:nil, preferredStyle: .ActionSheet)
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
(alert: UIAlertAction!) -> Void in
})
//for ios 7 and lower compatibility
let cameraAction = UIAlertAction(title: "Take a New Pic", style: .Default, handler: {
(alert: UIAlertAction!) -> Void in
self.picker.allowsEditing = false
self.picker.sourceType = UIImagePickerControllerSourceType.Camera
self.picker.cameraCaptureMode = .Photo
self.presentViewController(self.picker, animated: true, completion: nil)
if objc_getClass("UIAlertController") != nil {
})
let captureMenu = UIAlertController(title: nil, message:nil, preferredStyle: .ActionSheet)
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
(alert: UIAlertAction!) -> Void in
})
let cameraAction = UIAlertAction(title: "Take a New Pic", style: .Default, handler: {
(alert: UIAlertAction!) -> Void in
self.picker.allowsEditing = false
self.picker.sourceType = UIImagePickerControllerSourceType.Camera
self.picker.cameraCaptureMode = .Photo
self.presentViewController(self.picker, animated: true, completion: nil)
})
let galleryAction = UIAlertAction(title: "Select a Profile Pic", style: .Default, handler: {
(alert: UIAlertAction!) -> Void in
self.picker.allowsEditing = false
self.picker.sourceType = .PhotoLibrary
self.presentViewController(self.picker, animated: true, completion: nil)
})
captureMenu.addAction(galleryAction)
captureMenu.addAction(cameraAction)
captureMenu.addAction(cancelAction)
self.presentViewController(captureMenu, animated: true, completion: nil)
}else{
let actionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: "Cancel", otherButtonTitles: "Take a New Pic")
actionSheet.addButtonWithTitle("Select a Profile Pic")
actionSheet.showInView(self.view)
}
let galleryAction = UIAlertAction(title: "Select a Profile Pic", style: .Default, handler: {
(alert: UIAlertAction!) -> Void in
self.picker.allowsEditing = false
self.picker.sourceType = .PhotoLibrary
self.presentViewController(self.picker, animated: true, completion: nil)
})
captureMenu.addAction(galleryAction)
captureMenu.addAction(cameraAction)
captureMenu.addAction(cancelAction)
self.presentViewController(captureMenu, animated: true, completion: nil)
}
@ -350,3 +391,27 @@ extension ProfileDetailViewController: UIImagePickerControllerDelegate{
dismissViewControllerAnimated(true, completion: nil)
}
}
extension ProfileDetailViewController: UIActionSheetDelegate {
func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
switch buttonIndex {
case 0:
break;
case 1:
self.picker.allowsEditing = false
self.picker.sourceType = UIImagePickerControllerSourceType.Camera
self.picker.cameraCaptureMode = .Photo
self.presentViewController(self.picker, animated: true, completion: nil)
case 2:
self.picker.allowsEditing = false
self.picker.sourceType = .PhotoLibrary
self.presentViewController(self.picker, animated: true, completion: nil)
break;
default:
break;
}
}
}

View File

@ -27,13 +27,27 @@ class SignInController: UIViewController, UINavigationControllerDelegate, UIImag
|| self.passField.hasText() == false
|| self.profilePic.image == nil){
let alert = UIAlertController(title: "Invalid Registration", message: "We're missing some information from you, before we can start the party!", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(title: "Invalid Registration", message: "We're missing some information from you, before we can start the party!", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Invalid Registration"
alert.message = "We're missing some information from you, before we can start the party!"
alert.addButtonWithTitle("OK")
alert.show()
}
}else{
if /*(!(contains(self.userField.text!, "@") ||*/ contains(self.nameField.text!, "@"){
if /*(!(contains(self.userField.text!, "@") ||*/ !contains(self.nameField.text!, "@"){
let predicate: NSPredicate = NSPredicate(format: "(email = %@)", argumentArray: [self.emailField.text!])
var userQuery: PFQuery = PFQuery(className: "_User", predicate: predicate)
@ -43,10 +57,23 @@ class SignInController: UIViewController, UINavigationControllerDelegate, UIImag
(object, error) -> Void in
if(object != nil && error == nil){
let alert = UIAlertController(title: "User Info Taken", message: "Sorry this information is already registered to another user. Please try again.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
//for ios 7 and lower compatibility
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(title: "User Info Taken", message: "Sorry this information is already registered to another user. Please try again.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "User Info Taken"
alert.message = "Sorry this information is already registered to another user. Please try again."
alert.addButtonWithTitle("OK")
alert.show()
}
}else{
var user = PFUser()
var img:PFFile = PFFile(data: UIImageJPEGRepresentation(self.profilePic.image, 1.0))!
@ -78,10 +105,22 @@ class SignInController: UIViewController, UINavigationControllerDelegate, UIImag
}else{
let alert = UIAlertController(title: "Illegal Characters", message: "The username or email you entered contains illegal characters such as: '@'", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
//for ios 7 and lower compatibility
self.presentViewController(alert, animated: true, completion: nil)
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(title: "Illegal Characters", message: "The display name you entered contains illegal characters such as: '@'", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
self.presentViewController(alert, animated: true, completion: nil)
}else{
let alert = UIAlertView()
alert.title = "Illegal Characters"
alert.message = "The display name you entered contains illegal characters such as: '@'"
alert.addButtonWithTitle("OK")
alert.show()
}
}
}

View File

@ -142,6 +142,7 @@ class TestInviteFriendsController: UIViewController, UITableViewDelegate, UITabl
//iterate through the currently found peers and display only friends who are available
var friend: FriendData!
//need to rethink this logic
for i in 0..<self.frnds.count {
if(self.partyData.isInvitable[i] == true){
friend = self.frnds[i]