From 25f454d1cfb06bf73e4dfcd4e87c7683b7bd8a99 Mon Sep 17 00:00:00 2001 From: Sugam Pandey Date: Thu, 6 Jul 2017 19:24:26 -0600 Subject: [PATCH 01/23] When Search bar is presented, the Done button should not invoke delegate's callback --- Pods/EPContactsPicker.swift | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Pods/EPContactsPicker.swift b/Pods/EPContactsPicker.swift index d4d333b..3d1ade2 100644 --- a/Pods/EPContactsPicker.swift +++ b/Pods/EPContactsPicker.swift @@ -49,6 +49,8 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS var subtitleCellValue = SubtitleCellValue.phoneNumber var multiSelectEnabled: Bool = false //Default is single selection contact + var isPresentingSearch: Bool = false + // MARK: - Lifecycle Methods override open func viewDidLoad() { @@ -334,7 +336,11 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS func onTouchDoneButton() { dismiss(animated: true, completion: { - self.contactDelegate?.epContactPicker(self, didSelectMultipleContacts: self.selectedContacts) + if self.isPresentingSearch { + self.isPresentingSearch = false + } else { + self.contactDelegate?.epContactPicker(self, didSelectMultipleContacts: self.selectedContacts) + } }) } @@ -373,4 +379,8 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS }) } + open func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { + self.isPresentingSearch = true + } + } From abb46597043e316dceb84786185213706a7f9900 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Thu, 13 Jul 2017 17:12:55 +0300 Subject: [PATCH 02/23] Added: Select All Contacts/Decelect button, Send Invites Button, custom checkmarks --- .../AppIcon.appiconset/Contents.json | 25 +++ .../CircularSelected_icon@2x.png | Bin 0 -> 1279 bytes .../CircularSelected_icon@3x.png | Bin 0 -> 1910 bytes .../Contents.json | 22 ++ .../CircularUnselected_icon@2x.png | Bin 0 -> 1165 bytes .../CircularUnselected_icon@3x.png | Bin 0 -> 1880 bytes .../Contents.json | 22 ++ Contacts Picker/Assets.xcassets/Contents.json | 6 + Contacts Picker/Base.lproj/Main.storyboard | 63 ++++-- Contacts Picker/ViewController.swift | 16 +- Pods/EPConstants.swift | 11 + Pods/EPContactCell.swift | 13 ++ Pods/EPContactCell.xib | 48 +++-- Pods/EPContactsPicker.swift | 191 ++++++++++++++---- 14 files changed, 345 insertions(+), 72 deletions(-) create mode 100644 Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/CircularSelected_icon@2x.png create mode 100644 Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/CircularSelected_icon@3x.png create mode 100644 Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/Contents.json create mode 100644 Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@2x.png create mode 100644 Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@3x.png create mode 100644 Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/Contents.json create mode 100644 Contacts Picker/Assets.xcassets/Contents.json diff --git a/Contacts Picker/Assets.xcassets/AppIcon.appiconset/Contents.json b/Contacts Picker/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80..1d060ed 100644 --- a/Contacts Picker/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Contacts Picker/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -59,6 +79,11 @@ "idiom" : "ipad", "size" : "76x76", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" } ], "info" : { diff --git a/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/CircularSelected_icon@2x.png b/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/CircularSelected_icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..80dfc4486371ecc136277cfc0dc00dd95baa481e GIT binary patch literal 1279 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 literal 0 HcmV?d00001 diff --git a/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/Contents.json b/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/Contents.json new file mode 100644 index 0000000..bbb844f --- /dev/null +++ b/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "CircularSelected_icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "CircularSelected_icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@2x.png b/Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5b1c45136afafa57c3ce26a364e9cdbe7991ff GIT binary patch literal 1165 zcmV;81akX{P)Px(M@d9MR9Fe!ncZp=K@`VlmSj^+TKq&%R7$~8t6tO!f<8k9uf6gC^a=DrpTHOJ zs@H;j1_i;|3$+#trBqQ6KWP(fKFD}}voo6yv$au^Y&_8J&g|}--=3WL`ma($X8Lb= z7Z(@LR;y-CDScXNbyO*H)EF&CsnO=W{C{tZlB0Q*&FY2O+1VF=1gL3M!k;+Hx3XxuhzU zs{B<{wOUo1n??2Y>o;5Gn%255hxtrK-4gIO)a}N01-!hx9ByuI3uyg@G&&LlfjM&I zus(S3fGQO7yYUm>Q!JL$=g(i%hYuf3y(H_{M~j-vTc!Egh~@ z>JKEMmnACZ(4hnR`0-;lk_m0@s+!2Zefv&*`t(JbHqx|y6o$donVFf7J2kK)@RKLc z&Pihn(qT^KayfJA)P&CG_wLkQ*Vjs=?`m~*&6LY!VbL1`K6mlr`R7RuB?3Fx#{ydz z9UWDZlM^Z<3D*m&Nym8odQEL@ZAtUGDA1RZpgRJS2IX@7DUp>FP!kj5bdp}M#%;Nz%vE_VJacC1pLei!=SgKc;>(vSK$m59oNOMa zTOu4y3MR+U^{+>RB)CrX_=Z8Qjkt*_zAXl3x|P~%ObU#%gEkmofyuF1q!^gBf&2sk zGZ@qDpbZ9CU~=o0R$wVzp@v~BEymRE%(8KABOFZiO@W?zU!J8(A+OVI)Uc1zU<#8ww< zr6P+MT@IrgD7(9LS5tFf$BjkWMjTL@aeo;f&l7+`@3Hcw(x zf`SYAJn|8W%%BYhCuPn1bbu)arhqUfV{#e!h>hT&4Bs$_|LusWLDB*&Z}LWf@5$Oz zBOjs2^xN=>Zx|2>Bc=vL3ozAVVq63} ffKF}y7j-`Y-%MbOs=F0)00000NkvXXu0mjfZ=D^m literal 0 HcmV?d00001 diff --git a/Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@3x.png b/Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b37db46e1d129823ff3abcea7e3d4c6259f14926 GIT binary patch literal 1880 zcmV-e2dDUnP)Px+5=lfsRCodHoKI{MM-+!=?Zi$M5`{KE8^{3?B5@>5V|qh9R235E-ng_qlna$w z&WK)VC3Y{vvN(+Hf1urB3p%XZ!OQ@?v&-}MtG zj;=KF-Db+XbRnjvr@M z^!4pAsZ;(e^{H7|Sv60dte9udo<)mDzhWNBc42aI;ztptSXE#f880M+ zG=uSt4fBIk|4H{ZGnsC)Z{MJ7Z`rHwe%9*T3qeshTaq(|yK5JoFI#;>#oXzFl z`#H?q#?H3A6-Uzf{PZ{C&lmbTRQH1i-?1XRDgpGjG(`}^c<|saLo-qn{V(To6JLoR z+q(5`ONd*yZVjxh6@C>bKGYxHv!~Y_J$l4Y8(xP|EAHI6Yo0zW_aP#}wQM&1@$uuw zpET-I!$L@ZFtWMn|0Wk=Oiw;I_@)^dIsD3+f&Natl-e;rf6pv0{~H#Snlane<(-m# zV?NBRvD1(cK~31qs|Zy8Lx+ZJbEt9d9sh`Ca{vCKK^P1%ve~X&BQ>M$y-ZG;4w^$y z6S((}jg7RN2!PX1;Tt|;T)0wG4l-E4D@me2OPV6@gnMcZYT}e8zVSmJ(Aeb8IGK2Yqbj zVTtDiZFB7;20r6^d3@tf25i+7RYEX|l-~BD7NsYCT@Op@!;7T&4ucwOFzT_URYC+q z>0lJ8V+SqVt|{Xmy_h1z0T`n!6+$qnB5mos7UBf$*d)|{O<{mV4Mte?n6yF&W|l-T zJE_7@no(p@3>KI$7-4nUB0~6Q^h4$ol299z2Nsyrm`c=r(ol$CqLn$uz?f7?nz>9; zD^A0#jG++BHcO?kV`-+>m{&}i!30}iel}nZjzS?yQ|>mGImV=#%jPnNLJ0Utg=eBQ zsTN@inXM3VJ7Ji5OyQYrPO3%NSa7mKbSnhQaFSsMSFAgfA4!uZ2W&86FvHHi6@s-$ z4zMJ4k^x!yugj?HRtUMr%7ScQtUx8*Tt;QLLP#YEdqVMtcDux0o|qBv>k3b}PEswx7Bbr!0W=|e3Qx>ZQq5&^nL{CnW0Zw-8;e8WmfN8u zMHHCIL1~05!W>vA1i_p#zj;MJAaE;b<}$(R2C#-g08KEb!V|qF_gFn_`xF+K)Ld5b zB0~6AMX3coAcT+TwWJs<8kPtn(Yr2Ng%Gl2z9F}hOIm=awItLE7+_I@5mr4Wtq_6? z!g@uqhwKxv=AMAOb~G3?CKEOoqa0O25Zf$;FK9smwDcsJ*G?(E!=MIRT>N&G5PX5y zX1SG4vCktZag6QQMDQ8k%R>flDqw@G(qe^>HdG|GSyDUxAefUl#&$D&)<9HPN=&g6 zF0n!YES<>=vCRrkFsEC^G{03-e60*X_0PhzmA_jG!50YdmNs=+zf3UadQ$mk}_-kf>TRGMe5$5LZ*_U8okS1|0mwWe=q&27B zYSxI-i3$XGi>h|=hH0+Z+4+`iCNu|p)2TRo4t%dIg5~5-Beolq?x?i;nt~%nsm~xj zI}A-`VYPK$T=Bk>KHuuG4o1i{+eEL5shrY#x SBS&EX0000 - + + + + + - + + @@ -13,24 +17,49 @@ - + - + + + + + + + + - + - - + + diff --git a/Contacts Picker/ViewController.swift b/Contacts Picker/ViewController.swift index 54a3cc3..18e9aa8 100644 --- a/Contacts Picker/ViewController.swift +++ b/Contacts Picker/ViewController.swift @@ -20,13 +20,25 @@ class ViewController: UIViewController, EPPickerDelegate { // Dispose of any resources that can be recreated. } - @IBAction func onTouchShowMeContactsButton(_ sender: AnyObject) { + @IBAction func onTouchShowMeEmailContactsButton(_ sender: AnyObject) { - let contactPickerScene = EPContactsPicker(delegate: self, multiSelection:true, subtitleCellType: SubtitleCellValue.email) + let contactPickerScene = EPContactsPicker(delegate: self, multiSelection: true, subtitleCellType: .email, selectAllContactsOnLoad: true, sendInvitesButtonEnabled: true) let navigationController = UINavigationController(rootViewController: contactPickerScene) self.present(navigationController, animated: true, completion: nil) } + @IBAction func onTouchShowMePhoneContactsButton(_ sender: Any) { + let contactPickerScene = EPContactsPicker(delegate: self, multiSelection: true, subtitleCellType: .phoneNumber, selectAllContactsOnLoad: false, sendInvitesButtonEnabled: true) + let navigationController = UINavigationController(rootViewController: contactPickerScene) + self.present(navigationController, animated: true, completion: nil) + } + @IBAction func onTouchShowMeAllContactsButton(_ sender: Any) { + let contactPickerScene = EPContactsPicker(delegate: self, multiSelection: false) + let navigationController = UINavigationController(rootViewController: contactPickerScene) + self.present(navigationController, animated: true, completion: nil) + } + + //MARK: EPContactsPicker delegates func epContactPicker(_: EPContactsPicker, didContactFetchFailed error : NSError) diff --git a/Pods/EPConstants.swift b/Pods/EPConstants.swift index 3cc4300..1d257d7 100644 --- a/Pods/EPConstants.swift +++ b/Pods/EPConstants.swift @@ -38,4 +38,15 @@ struct EPGlobalConstants { static let alphabets = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","#"] //# indicates the names with numbers and blank spaces } +//MARK: "Invite" button constants + struct SendInvitesButton { + static let height:CGFloat = 44 + static let titleColor = UIColor.init(colorLiteralRed: 0, green: 122.0/255.0, blue:1.0, alpha:1.0) + static let titleFont = UIFont(name: "HelveticaNeue-Medium", size: 16.0) + } +//MARK: "SelectContacts" button constants + struct SelectAllContactsButton { + static let selectAllContactString = "Select All" + static let deselectAllContactsString = "Deselect All" + } } diff --git a/Pods/EPContactCell.swift b/Pods/EPContactCell.swift index 7944249..70af90e 100644 --- a/Pods/EPContactCell.swift +++ b/Pods/EPContactCell.swift @@ -15,8 +15,21 @@ class EPContactCell: UITableViewCell { @IBOutlet weak var contactImageView: UIImageView! @IBOutlet weak var contactInitialLabel: UILabel! @IBOutlet weak var contactContainerView: UIView! + @IBOutlet weak var checkMarkView: UIImageView! + var contact: EPContact? + var contactSelected: Bool = false{ + didSet{ + var image = UIImage() + if contactSelected { + image = UIImage(named: "CircularSelected_icon")! + }else{ + image = UIImage(named: "CircularUnselected_icon")! + } + checkMarkView.image = image + } + } override func awakeFromNib() { diff --git a/Pods/EPContactCell.xib b/Pods/EPContactCell.xib index bb7ca02..40413aa 100644 --- a/Pods/EPContactCell.xib +++ b/Pods/EPContactCell.xib @@ -1,29 +1,34 @@ - - + + + + + - + + + - + - + @@ -31,33 +36,45 @@ + - + + + + + + + + - + - + + + + @@ -67,4 +84,7 @@ + + + diff --git a/Pods/EPContactsPicker.swift b/Pods/EPContactsPicker.swift index 3d1ade2..0947f34 100644 --- a/Pods/EPContactsPicker.swift +++ b/Pods/EPContactsPicker.swift @@ -33,7 +33,7 @@ public enum SubtitleCellValue{ case organization } -open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate { +open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource { // MARK: - Properties @@ -43,7 +43,15 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS var orderedContacts = [String: [CNContact]]() //Contacts ordered in dicitonary alphabetically var sortedContactKeys = [String]() - var selectedContacts = [EPContact]() + var selectedContacts = [EPContact](){ + didSet { + if sendInvitesButton != nil { + updateSendInvitesButtonTitle() + updateContactSelectionButton() + } + } + } + var filteredContacts = [CNContact]() var subtitleCellValue = SubtitleCellValue.phoneNumber @@ -51,13 +59,17 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS var isPresentingSearch: Bool = false + var shouldSelectAllContactsOnLoad = false //If we need all contacts selected on controller load select true + var tableView = UITableView() + var sendInvitesButton: UIBarButtonItem? + var totalNumberOfLoadedContacts = 0 + // MARK: - Lifecycle Methods override open func viewDidLoad() { super.viewDidLoad() self.title = EPGlobalConstants.Strings.contactsTitle - - registerContactCell() + initializeTableView() inititlizeBarButtons() initializeSearchBar() reloadContacts() @@ -81,12 +93,35 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS self.navigationItem.leftBarButtonItem = cancelButton if multiSelectEnabled { - let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(onTouchDoneButton)) - self.navigationItem.rightBarButtonItem = doneButton - + let selectAllContactsButton = UIBarButtonItem(title: EPGlobalConstants.SelectAllContactsButton.selectAllContactString, style: UIBarButtonItemStyle.plain, target: self, action: #selector(onTouchSelectionButton)) + self.navigationItem.rightBarButtonItem = selectAllContactsButton } } + func initializeTableView(){ + tableView = UITableView(frame: view.bounds, style: .plain) + tableView.delegate = self + tableView.dataSource = self + registerContactCell() + view.addSubview(tableView) + } + + func initializeToolBarWithButton(){ + let toolBar = UIToolbar(frame: CGRect(x: 0, + y: view.frame.height - EPGlobalConstants.SendInvitesButton.height, + width: view.frame.width, + height: EPGlobalConstants.SendInvitesButton.height)) + let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) + sendInvitesButton = UIBarButtonItem(title: "", style: .plain, target: self, action: #selector(onTouchSendInvitesButton)) + updateSendInvitesButtonTitle() + let attributes = [NSFontAttributeName:EPGlobalConstants.SendInvitesButton.titleFont!] + sendInvitesButton!.setTitleTextAttributes(attributes, for: []) + toolBar.items = [space, sendInvitesButton!, space] + toolBar.backgroundColor = UIColor.white + tableView.frame = CGRect(x: 0, y: 0, width: tableView.frame.width, height: tableView.frame.height - toolBar.frame.height) + view.addSubview(toolBar) + } + fileprivate func registerContactCell() { let podBundle = Bundle(for: self.classForCoder) @@ -120,18 +155,30 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS } convenience public init(delegate: EPPickerDelegate?, multiSelection : Bool) { - self.init(style: .plain) + self.init() self.multiSelectEnabled = multiSelection contactDelegate = delegate } convenience public init(delegate: EPPickerDelegate?, multiSelection : Bool, subtitleCellType: SubtitleCellValue) { - self.init(style: .plain) + self.init() self.multiSelectEnabled = multiSelection contactDelegate = delegate subtitleCellValue = subtitleCellType } + convenience public init(delegate: EPPickerDelegate?, multiSelection : Bool, subtitleCellType: SubtitleCellValue, selectAllContactsOnLoad: Bool, sendInvitesButtonEnabled: Bool) { + self.init() + self.multiSelectEnabled = multiSelection + contactDelegate = delegate + subtitleCellValue = subtitleCellType + if selectAllContactsOnLoad { + shouldSelectAllContactsOnLoad = true + } + if sendInvitesButtonEnabled { + initializeToolBarWithButton() + } + } // MARK: - Contact Operations @@ -139,9 +186,13 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS getContacts( {(contacts, error) in if (error == nil) { DispatchQueue.main.async(execute: { + if self.shouldSelectAllContactsOnLoad { + self.selectAllContacts() + } self.tableView.reloadData() }) } + self.totalNumberOfLoadedContacts = contacts.count }) } @@ -190,22 +241,18 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS do { try contactsStore?.enumerateContacts(with: contactFetchRequest, usingBlock: { (contact, stop) -> Void in - //Ordering contacts based on alphabets in firstname - contactsArray.append(contact) - var key: String = "#" - //If ordering has to be happening via family name change it here. - if let firstLetter = contact.givenName[0..<1] , firstLetter.containsAlphabets() { - key = firstLetter.uppercased() - } - var contacts = [CNContact]() - - if let segregatedContact = self.orderedContacts[key] { - contacts = segregatedContact - } - contacts.append(contact) - self.orderedContacts[key] = contacts - - }) + switch self.subtitleCellValue { + case .email: + if !contact.emailAddresses.isEmpty { + self.insert(contact: contact, to: &contactsArray) + } + case .phoneNumber: + if !contact.phoneNumbers.isEmpty { + self.insert(contact: contact, to: &contactsArray) + } + default: + self.insert(contact: contact, to: &contactsArray) + } }) self.sortedContactKeys = Array(self.orderedContacts.keys).sorted(by: <) if self.sortedContactKeys.first == "#" { self.sortedContactKeys.removeFirst() @@ -221,6 +268,23 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS } } + func insert(contact: CNContact, to contactsArray: inout [CNContact]){ + //Ordering contacts based on alphabets in firstname + contactsArray.append(contact) + var key: String = "#" + //If ordering has to be happening via family name change it here. + if let firstLetter = contact.givenName[0..<1] , firstLetter.containsAlphabets() { + key = firstLetter.uppercased() + } + var contacts = [CNContact]() + + if let segregatedContact = self.orderedContacts[key] { + contacts = segregatedContact + } + contacts.append(contact) + self.orderedContacts[key] = contacts + } + func allowedContactKeys() -> [CNKeyDescriptor]{ //We have to provide only the keys which we have to access. We should avoid unnecessary keys when fetching the contact. Reducing the keys means faster the access. return [CNContactNamePrefixKey as CNKeyDescriptor, @@ -236,14 +300,31 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS ] } + func selectAllContacts(){ + let array = Array(orderedContacts.values) + selectedContacts.removeAll() + for contactArray in array{ + for contact in contactArray { + let ePContact = EPContact(contact: contact) + selectedContacts.append(ePContact) + } + } + tableView.reloadData() + } + + func deselectAllContacts() { + selectedContacts.removeAll() + tableView.reloadData() + } + // MARK: - Table View DataSource - override open func numberOfSections(in tableView: UITableView) -> Int { + public func numberOfSections(in tableView: UITableView) -> Int { if resultSearchController.isActive { return 1 } return sortedContactKeys.count } - override open func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if resultSearchController.isActive { return filteredContacts.count } if let contactsForSection = orderedContacts[sortedContactKeys[section]] { return contactsForSection.count @@ -253,9 +334,9 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS // MARK: - Table View Delegates - override open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! EPContactCell - cell.accessoryType = UITableViewCellAccessoryType.none + cell.contactSelected = false //Convert CNContact to EPContact let contact: EPContact @@ -271,27 +352,27 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS } if multiSelectEnabled && selectedContacts.contains(where: { $0.contactId == contact.contactId }) { - cell.accessoryType = UITableViewCellAccessoryType.checkmark + cell.contactSelected = true } cell.updateContactsinUI(contact, indexPath: indexPath, subtitleType: subtitleCellValue) return cell } - override open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let cell = tableView.cellForRow(at: indexPath) as! EPContactCell let selectedContact = cell.contact! if multiSelectEnabled { //Keeps track of enable=ing and disabling contacts - if cell.accessoryType == UITableViewCellAccessoryType.checkmark { - cell.accessoryType = UITableViewCellAccessoryType.none + if cell.contactSelected == true { + cell.contactSelected = false selectedContacts = selectedContacts.filter(){ return selectedContact.contactId != $0.contactId } } else { - cell.accessoryType = UITableViewCellAccessoryType.checkmark + cell.contactSelected = true selectedContacts.append(selectedContact) } } @@ -306,22 +387,22 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS } } - override open func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 60.0 } - override open func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int { + public func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int { if resultSearchController.isActive { return 0 } tableView.scrollToRow(at: IndexPath(row: 0, section: index), at: UITableViewScrollPosition.top , animated: false) return sortedContactKeys.index(of: title)! } - override open func sectionIndexTitles(for tableView: UITableView) -> [String]? { + public func sectionIndexTitles(for tableView: UITableView) -> [String]? { if resultSearchController.isActive { return nil } return sortedContactKeys } - override open func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + public func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { if resultSearchController.isActive { return nil } return sortedContactKeys[section] } @@ -334,7 +415,7 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS }) } - func onTouchDoneButton() { + func onTouchSendInvitesButton() { dismiss(animated: true, completion: { if self.isPresentingSearch { self.isPresentingSearch = false @@ -344,6 +425,14 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS }) } + func onTouchSelectionButton() { + if totalNumberOfLoadedContacts > selectedContacts.count { + selectAllContacts() + }else{ + deselectAllContacts() + } + } + // MARK: - Search Actions open func updateSearchResults(for searchController: UISearchController) @@ -383,4 +472,28 @@ open class EPContactsPicker: UITableViewController, UISearchResultsUpdating, UIS self.isPresentingSearch = true } + //MARK: - Update Appearance Of Send Invites Button + + func updateSendInvitesButtonTitle() { + let numberOfInvites = selectedContacts.count + var title = "" + if numberOfInvites > 0 { + title = "Send \(numberOfInvites) \(numberOfInvites == 1 ? "Invite" : "Invites")" + sendInvitesButton!.isEnabled = true + }else{ + title = "Select Contacts" + sendInvitesButton!.isEnabled = false + } + sendInvitesButton!.title = title + } + + func updateContactSelectionButton(){ + let contactSelectionButton = self.navigationItem.rightBarButtonItem + if totalNumberOfLoadedContacts > selectedContacts.count { + contactSelectionButton?.title = EPGlobalConstants.SelectAllContactsButton.selectAllContactString + }else{ + contactSelectionButton?.title = EPGlobalConstants.SelectAllContactsButton.deselectAllContactsString + } + } + } From 61005c734fece78ecba3a8ff97165c4370906fa9 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Fri, 14 Jul 2017 11:51:50 +0300 Subject: [PATCH 03/23] Added Resources folder --- Contacts Picker.xcodeproj/project.pbxproj | 35 +++++++++++++++++- .../CircularSelected_icon@2x.png | Bin 1279 -> 0 bytes .../CircularSelected_icon@3x.png | Bin 1910 -> 0 bytes .../Contents.json | 22 ----------- .../CircularUnselected_icon@2x.png | Bin 1165 -> 0 bytes .../CircularUnselected_icon@3x.png | Bin 1880 -> 0 bytes .../Contents.json | 22 ----------- EPContactsPicker.podspec | 2 +- 8 files changed, 34 insertions(+), 47 deletions(-) delete mode 100644 Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/CircularSelected_icon@2x.png delete mode 100644 Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/CircularSelected_icon@3x.png delete mode 100644 Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/Contents.json delete mode 100644 Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@2x.png delete mode 100644 Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@3x.png delete mode 100644 Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/Contents.json diff --git a/Contacts Picker.xcodeproj/project.pbxproj b/Contacts Picker.xcodeproj/project.pbxproj index 6d93bb0..1ea4566 100644 --- a/Contacts Picker.xcodeproj/project.pbxproj +++ b/Contacts Picker.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + A54DCE411F18BD2A00320D5C /* CircularSelected_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A54DCE3D1F18BD2A00320D5C /* CircularSelected_icon@2x.png */; }; + A54DCE421F18BD2A00320D5C /* CircularSelected_icon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = A54DCE3E1F18BD2A00320D5C /* CircularSelected_icon@3x.png */; }; + A54DCE431F18BD2A00320D5C /* CircularUnselected_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A54DCE3F1F18BD2A00320D5C /* CircularUnselected_icon@2x.png */; }; + A54DCE441F18BD2A00320D5C /* CircularUnselected_icon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = A54DCE401F18BD2A00320D5C /* CircularUnselected_icon@3x.png */; }; E210822E1D916C6F002CCAD5 /* EPContactsPicker.podspec in Resources */ = {isa = PBXBuildFile; fileRef = E210822D1D916C6F002CCAD5 /* EPContactsPicker.podspec */; }; F4C1C9421BDF8AB7001AA643 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4C1C9411BDF8AB7001AA643 /* AppDelegate.swift */; }; F4C1C9491BDF8AB7001AA643 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F4C1C9481BDF8AB7001AA643 /* Assets.xcassets */; }; @@ -23,6 +27,10 @@ /* Begin PBXFileReference section */ 4B7552C01CD28ADA00C638F1 /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = ""; }; + A54DCE3D1F18BD2A00320D5C /* CircularSelected_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "CircularSelected_icon@2x.png"; sourceTree = ""; }; + A54DCE3E1F18BD2A00320D5C /* CircularSelected_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "CircularSelected_icon@3x.png"; sourceTree = ""; }; + A54DCE3F1F18BD2A00320D5C /* CircularUnselected_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "CircularUnselected_icon@2x.png"; sourceTree = ""; }; + A54DCE401F18BD2A00320D5C /* CircularUnselected_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "CircularUnselected_icon@3x.png"; sourceTree = ""; }; E210822D1D916C6F002CCAD5 /* EPContactsPicker.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EPContactsPicker.podspec; sourceTree = ""; }; F4C1C93E1BDF8AB7001AA643 /* Contacts Picker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Contacts Picker.app"; sourceTree = BUILT_PRODUCTS_DIR; }; F4C1C9411BDF8AB7001AA643 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -50,6 +58,17 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + A54DCE3C1F18BC6E00320D5C /* Resources */ = { + isa = PBXGroup; + children = ( + A54DCE3D1F18BD2A00320D5C /* CircularSelected_icon@2x.png */, + A54DCE3E1F18BD2A00320D5C /* CircularSelected_icon@3x.png */, + A54DCE3F1F18BD2A00320D5C /* CircularUnselected_icon@2x.png */, + A54DCE401F18BD2A00320D5C /* CircularUnselected_icon@3x.png */, + ); + name = Resources; + sourceTree = ""; + }; F4C1C9351BDF8AB7001AA643 = { isa = PBXGroup; children = ( @@ -91,6 +110,7 @@ F4C1C9791BDF9227001AA643 /* EPContactCell.xib */, F4C1C97A1BDF9227001AA643 /* EPContactsPicker.swift */, F4C1C97B1BDF9227001AA643 /* EPExtensions.swift */, + A54DCE3C1F18BC6E00320D5C /* Resources */, ); name = EPContactsPicker; path = Pods; @@ -127,6 +147,7 @@ TargetAttributes = { F4C1C93D1BDF8AB7001AA643 = { CreatedOnToolsVersion = 7.0; + DevelopmentTeam = CHZJAHSJ6N; LastSwiftMigration = 0800; ProvisioningStyle = Manual; }; @@ -158,7 +179,11 @@ F4C1C94C1BDF8AB7001AA643 /* LaunchScreen.storyboard in Resources */, F4C1C9491BDF8AB7001AA643 /* Assets.xcassets in Resources */, F4C1C9741BDF8BE3001AA643 /* Main.storyboard in Resources */, + A54DCE411F18BD2A00320D5C /* CircularSelected_icon@2x.png in Resources */, + A54DCE431F18BD2A00320D5C /* CircularUnselected_icon@2x.png in Resources */, F4C1C97F1BDF9227001AA643 /* EPContactCell.xib in Resources */, + A54DCE441F18BD2A00320D5C /* CircularUnselected_icon@3x.png in Resources */, + A54DCE421F18BD2A00320D5C /* CircularSelected_icon@3x.png in Resources */, E210822E1D916C6F002CCAD5 /* EPContactsPicker.podspec in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -294,11 +319,14 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + DEVELOPMENT_TEAM = CHZJAHSJ6N; INFOPLIST_FILE = "Contacts Picker/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.prabaharan.eppicker.Contacts-Picker"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "798d471c-5612-4cfb-a241-fa0e4b14a4b6"; + PROVISIONING_PROFILE_SPECIFIER = "XC iOS: *"; SWIFT_VERSION = 3.0; }; name = Debug; @@ -307,11 +335,14 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + DEVELOPMENT_TEAM = CHZJAHSJ6N; INFOPLIST_FILE = "Contacts Picker/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.prabaharan.eppicker.Contacts-Picker"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "798d471c-5612-4cfb-a241-fa0e4b14a4b6"; + PROVISIONING_PROFILE_SPECIFIER = "XC iOS: *"; SWIFT_VERSION = 3.0; }; name = Release; diff --git a/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/CircularSelected_icon@2x.png b/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/CircularSelected_icon@2x.png deleted file mode 100644 index 80dfc4486371ecc136277cfc0dc00dd95baa481e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1279 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 diff --git a/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/Contents.json b/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/Contents.json deleted file mode 100644 index bbb844f..0000000 --- a/Contacts Picker/Assets.xcassets/CircularSelected_icon.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "CircularSelected_icon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "CircularSelected_icon@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@2x.png b/Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@2x.png deleted file mode 100644 index dd5b1c45136afafa57c3ce26a364e9cdbe7991ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1165 zcmV;81akX{P)Px(M@d9MR9Fe!ncZp=K@`VlmSj^+TKq&%R7$~8t6tO!f<8k9uf6gC^a=DrpTHOJ zs@H;j1_i;|3$+#trBqQ6KWP(fKFD}}voo6yv$au^Y&_8J&g|}--=3WL`ma($X8Lb= z7Z(@LR;y-CDScXNbyO*H)EF&CsnO=W{C{tZlB0Q*&FY2O+1VF=1gL3M!k;+Hx3XxuhzU zs{B<{wOUo1n??2Y>o;5Gn%255hxtrK-4gIO)a}N01-!hx9ByuI3uyg@G&&LlfjM&I zus(S3fGQO7yYUm>Q!JL$=g(i%hYuf3y(H_{M~j-vTc!Egh~@ z>JKEMmnACZ(4hnR`0-;lk_m0@s+!2Zefv&*`t(JbHqx|y6o$donVFf7J2kK)@RKLc z&Pihn(qT^KayfJA)P&CG_wLkQ*Vjs=?`m~*&6LY!VbL1`K6mlr`R7RuB?3Fx#{ydz z9UWDZlM^Z<3D*m&Nym8odQEL@ZAtUGDA1RZpgRJS2IX@7DUp>FP!kj5bdp}M#%;Nz%vE_VJacC1pLei!=SgKc;>(vSK$m59oNOMa zTOu4y3MR+U^{+>RB)CrX_=Z8Qjkt*_zAXl3x|P~%ObU#%gEkmofyuF1q!^gBf&2sk zGZ@qDpbZ9CU~=o0R$wVzp@v~BEymRE%(8KABOFZiO@W?zU!J8(A+OVI)Uc1zU<#8ww< zr6P+MT@IrgD7(9LS5tFf$BjkWMjTL@aeo;f&l7+`@3Hcw(x zf`SYAJn|8W%%BYhCuPn1bbu)arhqUfV{#e!h>hT&4Bs$_|LusWLDB*&Z}LWf@5$Oz zBOjs2^xN=>Zx|2>Bc=vL3ozAVVq63} ffKF}y7j-`Y-%MbOs=F0)00000NkvXXu0mjfZ=D^m diff --git a/Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@3x.png b/Contacts Picker/Assets.xcassets/CircularUnselected_icon.imageset/CircularUnselected_icon@3x.png deleted file mode 100644 index b37db46e1d129823ff3abcea7e3d4c6259f14926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1880 zcmV-e2dDUnP)Px+5=lfsRCodHoKI{MM-+!=?Zi$M5`{KE8^{3?B5@>5V|qh9R235E-ng_qlna$w z&WK)VC3Y{vvN(+Hf1urB3p%XZ!OQ@?v&-}MtG zj;=KF-Db+XbRnjvr@M z^!4pAsZ;(e^{H7|Sv60dte9udo<)mDzhWNBc42aI;ztptSXE#f880M+ zG=uSt4fBIk|4H{ZGnsC)Z{MJ7Z`rHwe%9*T3qeshTaq(|yK5JoFI#;>#oXzFl z`#H?q#?H3A6-Uzf{PZ{C&lmbTRQH1i-?1XRDgpGjG(`}^c<|saLo-qn{V(To6JLoR z+q(5`ONd*yZVjxh6@C>bKGYxHv!~Y_J$l4Y8(xP|EAHI6Yo0zW_aP#}wQM&1@$uuw zpET-I!$L@ZFtWMn|0Wk=Oiw;I_@)^dIsD3+f&Natl-e;rf6pv0{~H#Snlane<(-m# zV?NBRvD1(cK~31qs|Zy8Lx+ZJbEt9d9sh`Ca{vCKK^P1%ve~X&BQ>M$y-ZG;4w^$y z6S((}jg7RN2!PX1;Tt|;T)0wG4l-E4D@me2OPV6@gnMcZYT}e8zVSmJ(Aeb8IGK2Yqbj zVTtDiZFB7;20r6^d3@tf25i+7RYEX|l-~BD7NsYCT@Op@!;7T&4ucwOFzT_URYC+q z>0lJ8V+SqVt|{Xmy_h1z0T`n!6+$qnB5mos7UBf$*d)|{O<{mV4Mte?n6yF&W|l-T zJE_7@no(p@3>KI$7-4nUB0~6Q^h4$ol299z2Nsyrm`c=r(ol$CqLn$uz?f7?nz>9; zD^A0#jG++BHcO?kV`-+>m{&}i!30}iel}nZjzS?yQ|>mGImV=#%jPnNLJ0Utg=eBQ zsTN@inXM3VJ7Ji5OyQYrPO3%NSa7mKbSnhQaFSsMSFAgfA4!uZ2W&86FvHHi6@s-$ z4zMJ4k^x!yugj?HRtUMr%7ScQtUx8*Tt;QLLP#YEdqVMtcDux0o|qBv>k3b}PEswx7Bbr!0W=|e3Qx>ZQq5&^nL{CnW0Zw-8;e8WmfN8u zMHHCIL1~05!W>vA1i_p#zj;MJAaE;b<}$(R2C#-g08KEb!V|qF_gFn_`xF+K)Ld5b zB0~6AMX3coAcT+TwWJs<8kPtn(Yr2Ng%Gl2z9F}hOIm=awItLE7+_I@5mr4Wtq_6? z!g@uqhwKxv=AMAOb~G3?CKEOoqa0O25Zf$;FK9smwDcsJ*G?(E!=MIRT>N&G5PX5y zX1SG4vCktZag6QQMDQ8k%R>flDqw@G(qe^>HdG|GSyDUxAefUl#&$D&)<9HPN=&g6 zF0n!YES<>=vCRrkFsEC^G{03-e60*X_0PhzmA_jG!50YdmNs=+zf3UadQ$mk}_-kf>TRGMe5$5LZ*_U8okS1|0mwWe=q&27B zYSxI-i3$XGi>h|=hH0+Z+4+`iCNu|p)2TRo4t%dIg5~5-Beolq?x?i;nt~%nsm~xj zI}A-`VYPK$T=Bk>KHuuG4o1i{+eEL5shrY#x SBS&EX0000 "https://github.com/ipraba/EPContactsPicker.git", :tag => s.version.to_s } s.platform = :ios, '9.0' s.requires_arc = true - s.source_files = 'Pods' + s.source_files = 'Pods/EPContactsPicker/*' s.frameworks = 'Contacts', 'ContactsUI' s.resources = ["Pods/EPContactCell.xib"] s.resource_bundles = { From e85115c6e91bf917e70567c93f9b6072ee7d1072 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Fri, 14 Jul 2017 12:00:02 +0300 Subject: [PATCH 04/23] changes in pod spec --- EPContactsPicker.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EPContactsPicker.podspec b/EPContactsPicker.podspec index 447e279..fbfe086 100644 --- a/EPContactsPicker.podspec +++ b/EPContactsPicker.podspec @@ -17,7 +17,7 @@ DESC s.source = { :git => "https://github.com/ipraba/EPContactsPicker.git", :tag => s.version.to_s } s.platform = :ios, '9.0' s.requires_arc = true - s.source_files = 'Pods/EPContactsPicker/*' + s.source_files = 'Pods' s.frameworks = 'Contacts', 'ContactsUI' s.resources = ["Pods/EPContactCell.xib"] s.resource_bundles = { From 222d7cb5ff7a4bda540191724ff9d76e2e40afaa Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Fri, 14 Jul 2017 12:19:37 +0300 Subject: [PATCH 05/23] =?UTF-8?q?=D0=B2=D0=BE=D1=81=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B8=D0=BB=20pod=20spec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EPContactsPicker.podspec | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/EPContactsPicker.podspec b/EPContactsPicker.podspec index fbfe086..1b35c02 100644 --- a/EPContactsPicker.podspec +++ b/EPContactsPicker.podspec @@ -1,8 +1,8 @@ Pod::Spec.new do |s| - s.name = "EPContactsPicker" - s.version = "2.0.2" - s.summary = "A contacts picker component for iOS written in swift using new contacts framwork" - s.description = <<-DESC +s.name = "EPContactsPicker" +s.version = "2.0.2" +s.summary = "A contacts picker component for iOS written in swift using new contacts framwork" +s.description = <<-DESC Features 1. Single selection and multiselection option 2. Making the secondary data to show as requested(Phonenumbers, Emails, Birthday and Organisation) @@ -11,17 +11,17 @@ Features 5. EPContact object to get the properties of the contacts DESC - s.homepage = "https://github.com/ipraba/EPContactsPicker" - s.license = 'MIT' - s.author = { "Prabaharan" => "mailprabaharan.e@gmail.com" } - s.source = { :git => "https://github.com/ipraba/EPContactsPicker.git", :tag => s.version.to_s } - s.platform = :ios, '9.0' - s.requires_arc = true - s.source_files = 'Pods' - s.frameworks = 'Contacts', 'ContactsUI' - s.resources = ["Pods/EPContactCell.xib"] - s.resource_bundles = { - 'EPContactsPicker' => ['Pods/**/*.xib'] - } +s.homepage = "https://github.com/ipraba/EPContactsPicker" +s.license = 'MIT' +s.author = { "Prabaharan" => "mailprabaharan.e@gmail.com" } +s.source = { :git => "https://github.com/ipraba/EPContactsPicker.git", :tag => s.version.to_s } +s.platform = :ios, '9.0' +s.requires_arc = true +s.source_files = 'Pods' +s.frameworks = 'Contacts', 'ContactsUI' +s.resources = ["Pods/EPContactCell.xib"] +s.resource_bundles = { +'EPContactsPicker' => ['Pods/**/*.xib'] +} end From 8641db628843f3466f1161c412734bc294af9cee Mon Sep 17 00:00:00 2001 From: SergeiKu Date: Fri, 14 Jul 2017 12:40:18 +0300 Subject: [PATCH 06/23] Add files via upload --- Pods/CircularSelected_icon@2x.png | Bin 0 -> 1279 bytes Pods/CircularSelected_icon@3x.png | Bin 0 -> 1910 bytes Pods/CircularUnselected_icon@2x.png | Bin 0 -> 1165 bytes Pods/CircularUnselected_icon@3x.png | Bin 0 -> 1880 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Pods/CircularSelected_icon@2x.png create mode 100644 Pods/CircularSelected_icon@3x.png create mode 100644 Pods/CircularUnselected_icon@2x.png create mode 100644 Pods/CircularUnselected_icon@3x.png diff --git a/Pods/CircularSelected_icon@2x.png b/Pods/CircularSelected_icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..80dfc4486371ecc136277cfc0dc00dd95baa481e GIT binary patch literal 1279 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 literal 0 HcmV?d00001 diff --git a/Pods/CircularUnselected_icon@2x.png b/Pods/CircularUnselected_icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5b1c45136afafa57c3ce26a364e9cdbe7991ff GIT binary patch literal 1165 zcmV;81akX{P)Px(M@d9MR9Fe!ncZp=K@`VlmSj^+TKq&%R7$~8t6tO!f<8k9uf6gC^a=DrpTHOJ zs@H;j1_i;|3$+#trBqQ6KWP(fKFD}}voo6yv$au^Y&_8J&g|}--=3WL`ma($X8Lb= z7Z(@LR;y-CDScXNbyO*H)EF&CsnO=W{C{tZlB0Q*&FY2O+1VF=1gL3M!k;+Hx3XxuhzU zs{B<{wOUo1n??2Y>o;5Gn%255hxtrK-4gIO)a}N01-!hx9ByuI3uyg@G&&LlfjM&I zus(S3fGQO7yYUm>Q!JL$=g(i%hYuf3y(H_{M~j-vTc!Egh~@ z>JKEMmnACZ(4hnR`0-;lk_m0@s+!2Zefv&*`t(JbHqx|y6o$donVFf7J2kK)@RKLc z&Pihn(qT^KayfJA)P&CG_wLkQ*Vjs=?`m~*&6LY!VbL1`K6mlr`R7RuB?3Fx#{ydz z9UWDZlM^Z<3D*m&Nym8odQEL@ZAtUGDA1RZpgRJS2IX@7DUp>FP!kj5bdp}M#%;Nz%vE_VJacC1pLei!=SgKc;>(vSK$m59oNOMa zTOu4y3MR+U^{+>RB)CrX_=Z8Qjkt*_zAXl3x|P~%ObU#%gEkmofyuF1q!^gBf&2sk zGZ@qDpbZ9CU~=o0R$wVzp@v~BEymRE%(8KABOFZiO@W?zU!J8(A+OVI)Uc1zU<#8ww< zr6P+MT@IrgD7(9LS5tFf$BjkWMjTL@aeo;f&l7+`@3Hcw(x zf`SYAJn|8W%%BYhCuPn1bbu)arhqUfV{#e!h>hT&4Bs$_|LusWLDB*&Z}LWf@5$Oz zBOjs2^xN=>Zx|2>Bc=vL3ozAVVq63} ffKF}y7j-`Y-%MbOs=F0)00000NkvXXu0mjfZ=D^m literal 0 HcmV?d00001 diff --git a/Pods/CircularUnselected_icon@3x.png b/Pods/CircularUnselected_icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b37db46e1d129823ff3abcea7e3d4c6259f14926 GIT binary patch literal 1880 zcmV-e2dDUnP)Px+5=lfsRCodHoKI{MM-+!=?Zi$M5`{KE8^{3?B5@>5V|qh9R235E-ng_qlna$w z&WK)VC3Y{vvN(+Hf1urB3p%XZ!OQ@?v&-}MtG zj;=KF-Db+XbRnjvr@M z^!4pAsZ;(e^{H7|Sv60dte9udo<)mDzhWNBc42aI;ztptSXE#f880M+ zG=uSt4fBIk|4H{ZGnsC)Z{MJ7Z`rHwe%9*T3qeshTaq(|yK5JoFI#;>#oXzFl z`#H?q#?H3A6-Uzf{PZ{C&lmbTRQH1i-?1XRDgpGjG(`}^c<|saLo-qn{V(To6JLoR z+q(5`ONd*yZVjxh6@C>bKGYxHv!~Y_J$l4Y8(xP|EAHI6Yo0zW_aP#}wQM&1@$uuw zpET-I!$L@ZFtWMn|0Wk=Oiw;I_@)^dIsD3+f&Natl-e;rf6pv0{~H#Snlane<(-m# zV?NBRvD1(cK~31qs|Zy8Lx+ZJbEt9d9sh`Ca{vCKK^P1%ve~X&BQ>M$y-ZG;4w^$y z6S((}jg7RN2!PX1;Tt|;T)0wG4l-E4D@me2OPV6@gnMcZYT}e8zVSmJ(Aeb8IGK2Yqbj zVTtDiZFB7;20r6^d3@tf25i+7RYEX|l-~BD7NsYCT@Op@!;7T&4ucwOFzT_URYC+q z>0lJ8V+SqVt|{Xmy_h1z0T`n!6+$qnB5mos7UBf$*d)|{O<{mV4Mte?n6yF&W|l-T zJE_7@no(p@3>KI$7-4nUB0~6Q^h4$ol299z2Nsyrm`c=r(ol$CqLn$uz?f7?nz>9; zD^A0#jG++BHcO?kV`-+>m{&}i!30}iel}nZjzS?yQ|>mGImV=#%jPnNLJ0Utg=eBQ zsTN@inXM3VJ7Ji5OyQYrPO3%NSa7mKbSnhQaFSsMSFAgfA4!uZ2W&86FvHHi6@s-$ z4zMJ4k^x!yugj?HRtUMr%7ScQtUx8*Tt;QLLP#YEdqVMtcDux0o|qBv>k3b}PEswx7Bbr!0W=|e3Qx>ZQq5&^nL{CnW0Zw-8;e8WmfN8u zMHHCIL1~05!W>vA1i_p#zj;MJAaE;b<}$(R2C#-g08KEb!V|qF_gFn_`xF+K)Ld5b zB0~6AMX3coAcT+TwWJs<8kPtn(Yr2Ng%Gl2z9F}hOIm=awItLE7+_I@5mr4Wtq_6? z!g@uqhwKxv=AMAOb~G3?CKEOoqa0O25Zf$;FK9smwDcsJ*G?(E!=MIRT>N&G5PX5y zX1SG4vCktZag6QQMDQ8k%R>flDqw@G(qe^>HdG|GSyDUxAefUl#&$D&)<9HPN=&g6 zF0n!YES<>=vCRrkFsEC^G{03-e60*X_0PhzmA_jG!50YdmNs=+zf3UadQ$mk}_-kf>TRGMe5$5LZ*_U8okS1|0mwWe=q&27B zYSxI-i3$XGi>h|=hH0+Z+4+`iCNu|p)2TRo4t%dIg5~5-Beolq?x?i;nt~%nsm~xj zI}A-`VYPK$T=Bk>KHuuG4o1i{+eEL5shrY#x SBS&EX0000 Date: Fri, 14 Jul 2017 12:42:21 +0300 Subject: [PATCH 07/23] Update EPContactsPicker.podspec --- EPContactsPicker.podspec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/EPContactsPicker.podspec b/EPContactsPicker.podspec index 1b35c02..79d1622 100644 --- a/EPContactsPicker.podspec +++ b/EPContactsPicker.podspec @@ -19,9 +19,10 @@ s.platform = :ios, '9.0' s.requires_arc = true s.source_files = 'Pods' s.frameworks = 'Contacts', 'ContactsUI' -s.resources = ["Pods/EPContactCell.xib"] +s.resources = ["Pods/EPContactCell.xib", "Pods/*.png"] s.resource_bundles = { -'EPContactsPicker' => ['Pods/**/*.xib'] +'EPContactsPicker' => ['Pods/**/*.xib'], + 'EPContactsPicker' => ['Pods/**/*.png'] } end From 4db97a71eb914dc775998c60808178d50ad5ccef Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Fri, 14 Jul 2017 12:51:54 +0300 Subject: [PATCH 08/23] added folder name in images path --- Pods/EPContactCell.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pods/EPContactCell.swift b/Pods/EPContactCell.swift index 70af90e..96aed40 100644 --- a/Pods/EPContactCell.swift +++ b/Pods/EPContactCell.swift @@ -23,9 +23,9 @@ class EPContactCell: UITableViewCell { didSet{ var image = UIImage() if contactSelected { - image = UIImage(named: "CircularSelected_icon")! + image = UIImage(named: "Resources/CircularSelected_icon")! }else{ - image = UIImage(named: "CircularUnselected_icon")! + image = UIImage(named: "Resources/CircularUnselected_icon")! } checkMarkView.image = image } From bf446b6646585e4da535fbb3f1618e7834a307e5 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Fri, 14 Jul 2017 13:42:52 +0300 Subject: [PATCH 09/23] added new function to get images from pod bundle --- Pods/EPContactCell.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Pods/EPContactCell.swift b/Pods/EPContactCell.swift index 96aed40..972b343 100644 --- a/Pods/EPContactCell.swift +++ b/Pods/EPContactCell.swift @@ -17,15 +17,21 @@ class EPContactCell: UITableViewCell { @IBOutlet weak var contactContainerView: UIView! @IBOutlet weak var checkMarkView: UIImageView! + func getImage(named: String) -> UIImage { + let podBundle = Bundle(for: self.classForCoder) + let testImage = UIImage(named: "CircularSelected_icon", in: podBundle, compatibleWith: nil) + return testImage! + } + var contact: EPContact? var contactSelected: Bool = false{ didSet{ var image = UIImage() if contactSelected { - image = UIImage(named: "Resources/CircularSelected_icon")! + image = getImage(named: "CircularSelected_icon") }else{ - image = UIImage(named: "Resources/CircularUnselected_icon")! + image = getImage(named: "CircularUnselected_icon") } checkMarkView.image = image } From 148599a31c1d84036e18aaa810e00d325dc677cc Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Fri, 14 Jul 2017 14:07:52 +0300 Subject: [PATCH 10/23] fixed error in getImage function. --- Pods/EPContactCell.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pods/EPContactCell.swift b/Pods/EPContactCell.swift index 972b343..28db47f 100644 --- a/Pods/EPContactCell.swift +++ b/Pods/EPContactCell.swift @@ -19,7 +19,7 @@ class EPContactCell: UITableViewCell { func getImage(named: String) -> UIImage { let podBundle = Bundle(for: self.classForCoder) - let testImage = UIImage(named: "CircularSelected_icon", in: podBundle, compatibleWith: nil) + let testImage = UIImage(named: named, in: podBundle, compatibleWith: nil) return testImage! } From 47b4ca3f1edc9a41ac6d1ad3b48408172a6f72f9 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Fri, 14 Jul 2017 15:34:06 +0300 Subject: [PATCH 11/23] Some necessary improvements: getImage function renamed into getCheckMarkImage, image is unwrapped and if it is nil the assertionFailure triggers. --- Pods/EPContactCell.swift | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Pods/EPContactCell.swift b/Pods/EPContactCell.swift index 28db47f..002c0db 100644 --- a/Pods/EPContactCell.swift +++ b/Pods/EPContactCell.swift @@ -17,10 +17,15 @@ class EPContactCell: UITableViewCell { @IBOutlet weak var contactContainerView: UIView! @IBOutlet weak var checkMarkView: UIImageView! - func getImage(named: String) -> UIImage { + func getCheckMarkImage(named: String) -> UIImage { let podBundle = Bundle(for: self.classForCoder) - let testImage = UIImage(named: named, in: podBundle, compatibleWith: nil) - return testImage! + var image = UIImage() + if let checkMarkImage = UIImage(named: named, in: podBundle, compatibleWith: nil){ + image = checkMarkImage + }else{ + assertionFailure("Could not load checkmark image") + } + return image } @@ -29,9 +34,9 @@ class EPContactCell: UITableViewCell { didSet{ var image = UIImage() if contactSelected { - image = getImage(named: "CircularSelected_icon") + image = getCheckMarkImage(named: "CircularSelected_icon") }else{ - image = getImage(named: "CircularUnselected_icon") + image = getCheckMarkImage(named: "CircularUnselected_icon") } checkMarkView.image = image } From 402996ae0d62bac11fd8ba3aa012b796c5cc5467 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Fri, 14 Jul 2017 21:35:43 +0300 Subject: [PATCH 12/23] Fixed issue when some contacts with emails were shown without it in the table view. --- Contacts Picker.xcodeproj/project.pbxproj | 18 +++++++++--------- Pods/EPContact.swift | 5 ++++- Pods/EPContactsPicker.swift | 1 - 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Contacts Picker.xcodeproj/project.pbxproj b/Contacts Picker.xcodeproj/project.pbxproj index 1ea4566..9f0c0ed 100644 --- a/Contacts Picker.xcodeproj/project.pbxproj +++ b/Contacts Picker.xcodeproj/project.pbxproj @@ -149,7 +149,7 @@ CreatedOnToolsVersion = 7.0; DevelopmentTeam = CHZJAHSJ6N; LastSwiftMigration = 0800; - ProvisioningStyle = Manual; + ProvisioningStyle = Automatic; }; }; }; @@ -319,14 +319,14 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - DEVELOPMENT_TEAM = CHZJAHSJ6N; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Contacts Picker/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.prabaharan.eppicker.Contacts-Picker"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "798d471c-5612-4cfb-a241-fa0e4b14a4b6"; - PROVISIONING_PROFILE_SPECIFIER = "XC iOS: *"; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 3.0; }; name = Debug; @@ -335,14 +335,14 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - DEVELOPMENT_TEAM = CHZJAHSJ6N; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Contacts Picker/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.prabaharan.eppicker.Contacts-Picker"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "798d471c-5612-4cfb-a241-fa0e4b14a4b6"; - PROVISIONING_PROFILE_SPECIFIER = "XC iOS: *"; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 3.0; }; name = Release; diff --git a/Pods/EPContact.swift b/Pods/EPContact.swift index 199f5bb..49d1c71 100644 --- a/Pods/EPContact.swift +++ b/Pods/EPContact.swift @@ -56,7 +56,10 @@ open class EPContact { } for emailAddress in contact.emailAddresses { - guard let emailLabel = emailAddress.label else { continue } + var emailLabel = "email" + if emailAddress.label != nil { + emailLabel = emailAddress.label! + } let email = emailAddress.value as String emails.append((email,emailLabel)) diff --git a/Pods/EPContactsPicker.swift b/Pods/EPContactsPicker.swift index 0947f34..adff252 100644 --- a/Pods/EPContactsPicker.swift +++ b/Pods/EPContactsPicker.swift @@ -347,7 +347,6 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch assertionFailure() return UITableViewCell() } - contact = EPContact(contact: contactsForSection[(indexPath as NSIndexPath).row]) } From 3ab85a01f20e0534d1c5f920e2ccb455a7d85c44 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Fri, 14 Jul 2017 22:56:26 +0300 Subject: [PATCH 13/23] =?UTF-8?q?fixed=20bug:=20if=20tap=20on=20=E2=80=9CS?= =?UTF-8?q?earch=E2=80=9D=20and=20then=20cancel=20out=20of=20search=20the?= =?UTF-8?q?=20Picker=20didn't=20return=20array=20of=20selected=20contacts.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Pods/EPContactsPicker.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Pods/EPContactsPicker.swift b/Pods/EPContactsPicker.swift index adff252..9d69d12 100644 --- a/Pods/EPContactsPicker.swift +++ b/Pods/EPContactsPicker.swift @@ -57,7 +57,7 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch var subtitleCellValue = SubtitleCellValue.phoneNumber var multiSelectEnabled: Bool = false //Default is single selection contact - var isPresentingSearch: Bool = false +// var isPresentingSearch: Bool = false var shouldSelectAllContactsOnLoad = false //If we need all contacts selected on controller load select true var tableView = UITableView() @@ -347,7 +347,7 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch assertionFailure() return UITableViewCell() } - contact = EPContact(contact: contactsForSection[(indexPath as NSIndexPath).row]) + contact = EPContact(contact: contactsForSection[(indexPath as NSIndexPath).row]) // } if multiSelectEnabled && selectedContacts.contains(where: { $0.contactId == contact.contactId }) { @@ -416,11 +416,11 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch func onTouchSendInvitesButton() { dismiss(animated: true, completion: { - if self.isPresentingSearch { + /* if self.isPresentingSearch { self.isPresentingSearch = false - } else { + } else { */ self.contactDelegate?.epContactPicker(self, didSelectMultipleContacts: self.selectedContacts) - } + //} }) } @@ -468,7 +468,7 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch } open func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { - self.isPresentingSearch = true + //self.isPresentingSearch = true } //MARK: - Update Appearance Of Send Invites Button From bddc9fe906fc60123ee6a41792f8f80d86a676f3 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Sat, 15 Jul 2017 09:19:12 +0300 Subject: [PATCH 14/23] Improved Search. Now if contacts filtered by email, the search performs in only within contacts with emails. --- Pods/EPContactsPicker.swift | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Pods/EPContactsPicker.swift b/Pods/EPContactsPicker.swift index 9d69d12..de0b35a 100644 --- a/Pods/EPContactsPicker.swift +++ b/Pods/EPContactsPicker.swift @@ -57,7 +57,12 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch var subtitleCellValue = SubtitleCellValue.phoneNumber var multiSelectEnabled: Bool = false //Default is single selection contact -// var isPresentingSearch: Bool = false +// var isPresentingSearch: Bool = false{ +// didSet{ +// let contactSelectionButton = self.navigationItem.rightBarButtonItem +// contactSelectionButton?.customView?.isHidden = isPresentingSearch +// } +// } var shouldSelectAllContactsOnLoad = false //If we need all contacts selected on controller load select true var tableView = UITableView() @@ -450,7 +455,12 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch filteredContacts = try store.unifiedContacts(matching: predicate, keysToFetch: allowedContactKeys()) //print("\(filteredContacts.count) count") - + switch self.subtitleCellValue { + case .email: + filteredContacts = filteredContacts.filter{!$0.emailAddresses.isEmpty} + default: + break + } self.tableView.reloadData() } @@ -468,7 +478,7 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch } open func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { - //self.isPresentingSearch = true +// self.isPresentingSearch = true } //MARK: - Update Appearance Of Send Invites Button From fa7c528a07ef8f3bde534be134b9d596871e8018 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Sun, 16 Jul 2017 16:58:57 +0300 Subject: [PATCH 15/23] Added: hides navigation bar when search bar is activated, and shows it up when the cancel search button is pressed --- Pods/EPContactsPicker.swift | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Pods/EPContactsPicker.swift b/Pods/EPContactsPicker.swift index de0b35a..f8b1fa3 100644 --- a/Pods/EPContactsPicker.swift +++ b/Pods/EPContactsPicker.swift @@ -56,13 +56,12 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch var subtitleCellValue = SubtitleCellValue.phoneNumber var multiSelectEnabled: Bool = false //Default is single selection contact - -// var isPresentingSearch: Bool = false{ -// didSet{ -// let contactSelectionButton = self.navigationItem.rightBarButtonItem -// contactSelectionButton?.customView?.isHidden = isPresentingSearch -// } -// } + //Hides navigation bar when search bar is active. + var isPresentingSearch: Bool = false{ + didSet{ + navigationController!.isNavigationBarHidden = isPresentingSearch + } + } var shouldSelectAllContactsOnLoad = false //If we need all contacts selected on controller load select true var tableView = UITableView() @@ -100,6 +99,8 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch if multiSelectEnabled { let selectAllContactsButton = UIBarButtonItem(title: EPGlobalConstants.SelectAllContactsButton.selectAllContactString, style: UIBarButtonItemStyle.plain, target: self, action: #selector(onTouchSelectionButton)) self.navigationItem.rightBarButtonItem = selectAllContactsButton +// self.navigationItem. + } } @@ -471,14 +472,14 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch } open func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { - + isPresentingSearch = false DispatchQueue.main.async(execute: { self.tableView.reloadData() }) } open func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { -// self.isPresentingSearch = true + isPresentingSearch = true } //MARK: - Update Appearance Of Send Invites Button From 9f8202b35c2690214b0455c5c76a207bb7abf1f3 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Sun, 16 Jul 2017 20:46:31 +0300 Subject: [PATCH 16/23] small improvements --- Pods/EPContactCell.xib | 7 ++----- Pods/EPContactsPicker.swift | 1 + 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Pods/EPContactCell.xib b/Pods/EPContactCell.xib index 40413aa..1fda316 100644 --- a/Pods/EPContactCell.xib +++ b/Pods/EPContactCell.xib @@ -11,7 +11,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -84,7 +84,4 @@ - - - diff --git a/Pods/EPContactsPicker.swift b/Pods/EPContactsPicker.swift index f8b1fa3..a845332 100644 --- a/Pods/EPContactsPicker.swift +++ b/Pods/EPContactsPicker.swift @@ -148,6 +148,7 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch tableView.register(cellNib, forCellReuseIdentifier: "Cell") } } + override open func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() From 6d1496dad577e00989a032e6f8ecb2f09b1df851 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Mon, 17 Jul 2017 20:08:45 +0300 Subject: [PATCH 17/23] Changes in podspec file --- EPContactsPicker.podspec | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/EPContactsPicker.podspec b/EPContactsPicker.podspec index 79d1622..beef668 100644 --- a/EPContactsPicker.podspec +++ b/EPContactsPicker.podspec @@ -19,10 +19,11 @@ s.platform = :ios, '9.0' s.requires_arc = true s.source_files = 'Pods' s.frameworks = 'Contacts', 'ContactsUI' -s.resources = ["Pods/EPContactCell.xib", "Pods/*.png"] +s.source_files = "Pods/*.{swift}" + s.resource_bundles = { -'EPContactsPicker' => ['Pods/**/*.xib'], - 'EPContactsPicker' => ['Pods/**/*.png'] +'EPContactsPicker' => ['Pods/**/*.{xib,png}'] } + end From 606e19eafadf6b66c47f862a26f0582dcd08f229 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Tue, 18 Jul 2017 11:23:33 +0300 Subject: [PATCH 18/23] changes: now when search is activated the table shows contacts from all storages. --- Pods/EPContactsPicker.swift | 63 +++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/Pods/EPContactsPicker.swift b/Pods/EPContactsPicker.swift index a845332..4af7c29 100644 --- a/Pods/EPContactsPicker.swift +++ b/Pods/EPContactsPicker.swift @@ -56,12 +56,6 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch var subtitleCellValue = SubtitleCellValue.phoneNumber var multiSelectEnabled: Bool = false //Default is single selection contact - //Hides navigation bar when search bar is active. - var isPresentingSearch: Bool = false{ - didSet{ - navigationController!.isNavigationBarHidden = isPresentingSearch - } - } var shouldSelectAllContactsOnLoad = false //If we need all contacts selected on controller load select true var tableView = UITableView() @@ -77,14 +71,15 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch inititlizeBarButtons() initializeSearchBar() reloadContacts() + } func initializeSearchBar() { self.resultSearchController = ( { let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self - controller.dimsBackgroundDuringPresentation = false - controller.hidesNavigationBarDuringPresentation = false + controller.dimsBackgroundDuringPresentation = true// + controller.hidesNavigationBarDuringPresentation = true controller.searchBar.sizeToFit() controller.searchBar.delegate = self self.tableView.tableHeaderView = controller.searchBar @@ -99,8 +94,6 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch if multiSelectEnabled { let selectAllContactsButton = UIBarButtonItem(title: EPGlobalConstants.SelectAllContactsButton.selectAllContactString, style: UIBarButtonItemStyle.plain, target: self, action: #selector(onTouchSelectionButton)) self.navigationItem.rightBarButtonItem = selectAllContactsButton -// self.navigationItem. - } } @@ -423,11 +416,7 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch func onTouchSendInvitesButton() { dismiss(animated: true, completion: { - /* if self.isPresentingSearch { - self.isPresentingSearch = false - } else { */ - self.contactDelegate?.epContactPicker(self, didSelectMultipleContacts: self.selectedContacts) - //} + self.contactDelegate?.epContactPicker(self, didSelectMultipleContacts: self.selectedContacts) }) } @@ -445,42 +434,46 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch { if let searchText = resultSearchController.searchBar.text , searchController.isActive { - let predicate: NSPredicate + var predicate: NSPredicate? if searchText.characters.count > 0 { predicate = CNContact.predicateForContacts(matchingName: searchText) } else { - predicate = CNContact.predicateForContactsInContainer(withIdentifier: contactsStore!.defaultContainerIdentifier()) + getContacts({ (contacts, error) in + self.filteredContacts = contacts + }) } - - let store = CNContactStore() - do { - filteredContacts = try store.unifiedContacts(matching: predicate, - keysToFetch: allowedContactKeys()) - //print("\(filteredContacts.count) count") - switch self.subtitleCellValue { - case .email: - filteredContacts = filteredContacts.filter{!$0.emailAddresses.isEmpty} - default: - break + if predicate != nil { + let store = CNContactStore() + do { + filteredContacts = try store.unifiedContacts(matching: predicate!, + keysToFetch: allowedContactKeys()) + //print("\(filteredContacts.count) count") + switch self.subtitleCellValue { + case .email: + filteredContacts = filteredContacts.filter{!$0.emailAddresses.isEmpty} + default: + break + } + self.tableView.reloadData() + + } + catch { + print("Error!") } - self.tableView.reloadData() - - } - catch { - print("Error!") } } } + + open func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { - isPresentingSearch = false DispatchQueue.main.async(execute: { self.tableView.reloadData() }) } open func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { - isPresentingSearch = true + } //MARK: - Update Appearance Of Send Invites Button From 39fa39882a19e34dff4bfbb3647d9784baed2207 Mon Sep 17 00:00:00 2001 From: Sugam Pandey Date: Tue, 18 Jul 2017 06:23:57 -0700 Subject: [PATCH 19/23] Update podspec file --- EPContactsPicker.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EPContactsPicker.podspec b/EPContactsPicker.podspec index beef668..bab46fd 100644 --- a/EPContactsPicker.podspec +++ b/EPContactsPicker.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "EPContactsPicker" -s.version = "2.0.2" +s.version = "2.0.3" s.summary = "A contacts picker component for iOS written in swift using new contacts framwork" s.description = <<-DESC Features @@ -17,10 +17,10 @@ s.author = { "Prabaharan" => "mailprabaharan.e@gmail.com" } s.source = { :git => "https://github.com/ipraba/EPContactsPicker.git", :tag => s.version.to_s } s.platform = :ios, '9.0' s.requires_arc = true -s.source_files = 'Pods' s.frameworks = 'Contacts', 'ContactsUI' s.source_files = "Pods/*.{swift}" +s.resources = ["Pods/*.xib", "Pods/*.png"] s.resource_bundles = { 'EPContactsPicker' => ['Pods/**/*.{xib,png}'] } From dea48f24fe1a950d411ff6082107ba520d50d072 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Tue, 18 Jul 2017 18:59:01 +0300 Subject: [PATCH 20/23] fixed: double listing of the same contacts after search has been canceled. --- Pods/EPContactsPicker.swift | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Pods/EPContactsPicker.swift b/Pods/EPContactsPicker.swift index 4af7c29..7436937 100644 --- a/Pods/EPContactsPicker.swift +++ b/Pods/EPContactsPicker.swift @@ -437,12 +437,6 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch var predicate: NSPredicate? if searchText.characters.count > 0 { predicate = CNContact.predicateForContacts(matchingName: searchText) - } else { - getContacts({ (contacts, error) in - self.filteredContacts = contacts - }) - } - if predicate != nil { let store = CNContactStore() do { filteredContacts = try store.unifiedContacts(matching: predicate!, @@ -460,6 +454,14 @@ open class EPContactsPicker: UIViewController, UISearchResultsUpdating, UISearch catch { print("Error!") } + } else { + let array = Array(orderedContacts.values) + filteredContacts.removeAll() + for contactArray in array{ + for contact in contactArray { + filteredContacts.append(contact) + } + } } } } From 05c168ef9480296cd4dfd87a280bbdaee7526ea3 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Tue, 18 Jul 2017 19:43:53 +0300 Subject: [PATCH 21/23] corrected pod spec file --- EPContactsPicker.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EPContactsPicker.podspec b/EPContactsPicker.podspec index beef668..a6e7ff4 100644 --- a/EPContactsPicker.podspec +++ b/EPContactsPicker.podspec @@ -20,7 +20,7 @@ s.requires_arc = true s.source_files = 'Pods' s.frameworks = 'Contacts', 'ContactsUI' s.source_files = "Pods/*.{swift}" - +s.resources = ["Pods/**/*.{xib,png}"] s.resource_bundles = { 'EPContactsPicker' => ['Pods/**/*.{xib,png}'] } From fcd76c5ca07789f28917448c82f6f15f77e587a5 Mon Sep 17 00:00:00 2001 From: Sergey Kudryavtsev Date: Tue, 18 Jul 2017 20:22:20 +0300 Subject: [PATCH 22/23] changes in podspec --- EPContactsPicker.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EPContactsPicker.podspec b/EPContactsPicker.podspec index a6e7ff4..a99ff9e 100644 --- a/EPContactsPicker.podspec +++ b/EPContactsPicker.podspec @@ -20,7 +20,7 @@ s.requires_arc = true s.source_files = 'Pods' s.frameworks = 'Contacts', 'ContactsUI' s.source_files = "Pods/*.{swift}" -s.resources = ["Pods/**/*.{xib,png}"] +s.resources = ["Pods/*.xib", "Pods/*.png"] s.resource_bundles = { 'EPContactsPicker' => ['Pods/**/*.{xib,png}'] } From 46ef269eb81af7da92aaf29276b8b8803402f5f1 Mon Sep 17 00:00:00 2001 From: Sugam Pandey Date: Tue, 18 Jul 2017 11:14:21 -0700 Subject: [PATCH 23/23] Update to 2.0.4 pod --- EPContactsPicker.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EPContactsPicker.podspec b/EPContactsPicker.podspec index 69212d5..22cebb4 100644 --- a/EPContactsPicker.podspec +++ b/EPContactsPicker.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "EPContactsPicker" -s.version = "2.0.3" +s.version = "2.0.4" s.summary = "A contacts picker component for iOS written in swift using new contacts framwork" s.description = <<-DESC Features