2016-03-30 9 views
0

Ich habe kleines Problem in laden Telefon Kontakte in View-Controller, ich erfolgreich geladen meine Telefonkontakte in Tableview mit Namen und Nummer, aber es die Kontakte laden Namen als zufällig, ich möchte Kontaktname muss alphabetischer Reihenfolge sein, dieladen Sie Kontaktliste in alphabetischer Reihenfolge in swift

Hier ist mein Beispielcode Zahl gleich:

func contactDetail() { 

    var myPhValue:NSString! 
    var myPBfirstname:NSString! 

    let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 
    dispatch_async(backgroundQueue, { 
     let addressBook : ABAddressBookRef? = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue() 
     ABAddressBookRequestAccessWithCompletion(addressBook, { (granted : Bool, error: CFError!) -> Void in 
      if granted == true { 
       let allContacts : NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() 
       for contactRef:ABRecordRef in allContacts { // first name 
        myPBfirstname = ABRecordCopyValue(contactRef, kABPersonFirstNameProperty)?.takeRetainedValue() as! NSString? ?? "" 
        let myPBlastname = ABRecordCopyValue(contactRef, kABPersonLastNameProperty)?.takeRetainedValue() as! NSString? ?? "" 
        let phonesRef: ABMultiValueRef = ABRecordCopyValue(contactRef, kABPersonPhoneProperty)?.takeRetainedValue() as ABMultiValueRef? ?? "" 
        var phonesArray = Array<Dictionary<String,String>>() 
        for var i:Int = 0; i < ABMultiValueGetCount(phonesRef); i++ { 
         let myPhLabel = ABMultiValueCopyLabelAtIndex(phonesRef, i)?.takeRetainedValue() as NSString? ?? "" 
         myPhValue = ABMultiValueCopyValueAtIndex(phonesRef, i)?.takeRetainedValue() as! NSString? ?? "" 
         if myPhLabel.containsString("Mobile") { 

         } 
        } 
        let nameString = " "+(myPBlastname as String) 
        let nameValues = (myPBfirstname as String)+(nameString as String) 
        let contactDict : Dictionary = ["name": nameValues,"phone":myPhValue] 
        self.contactArray.addObject(contactDict) 

        if self.contactArray.count == 0 { 
         NSLog("contactValue is Zero") 
        } 
        else{ 
         NSLog("count Value %d", self.contactArray.count) 
        } 

       } 


      } 

      dispatch_async(dispatch_get_main_queue(), {() -> Void in 

       self.contactTable.hidden = false 
       self.contactTable.reloadData() 


      }) 
     }) 
    }) 

} 



func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
return contactArray.count 
} 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    let cell:UITableViewCell = self.contactTable.dequeueReusableCellWithIdentifier("cell") as UITableViewCell! 
    cell.selectionStyle = UITableViewCellSelectionStyle.None 

    cell.preservesSuperviewLayoutMargins = false 
    cell.separatorInset = UIEdgeInsetsZero 
    cell.layoutMargins = UIEdgeInsetsZero 



    cell.textLabel!.text = contactArray.valueForKey("name").objectAtIndex(indexPath.row) as? String 

    return cell 

} 
+1

Art phonesArray und in Tableview dann zeigen. – sourav

Antwort

3

Wie ich aus dem Code Ihrer contactArray annehmen wird mit Werten wie folgt aufgebaut:

let contactArray = [["name": "tim", "phone": 123], ["name": "adi", "phone": 1234], ["name": "cora", "phone": 456], ["name": "berta", "phone": 678]] 

Um es mit den Namen sortieren Sie die sort method verwenden können:

let sortedContactArray = contactArray.sort{ ($0["name"] as! String) < ($1["name"] as! String) } 

// result: [["phone": 1234, "name": adi], ["phone": 678, "name": berta], ["phone": 456, "name": cora], ["phone": 123, "name": tim]] 
+0

Ist es möglich, sie alphabetisch zu kategorisieren, so dass wir sie in tabellarischen Abschnitten auflisten können? – Satyam

+0

Ich verstehe nicht, was Sie meinen, indem Sie sie alphabetisch kategorisieren. Können Sie ein konkretes Beispiel geben oder Ihre Frage näher erläutern? @ Satyam – ronatory

3

Sie können:

var descriptor: NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true) 
var sortedResults: NSArray = contactArray.sortedArrayUsingDescriptors([descriptor]) 
+0

Was ist "Ergebnisse"? – user3458924

+0

Ihr KontaktArray – Patrick

+0

seit es ein NsArray ist, wie kann ich alle Objekte entfernen, nachdem ich das anrufe? – user3458924

2

Sie können auch kurze youse Swifty Art und Weise des Sortierens entfernt (natürlich, wenn Sie Swift Array statt NSArray verwenden)

contactArray.sortInPlace { $0["name"] < $1["name"] } 
+0

dam mit NsMutableArray für contactArray – user3458924