【问题标题】:load contact list in alphabetic order in swift快速按字母顺序加载联系人列表
【发布时间】:2016-03-30 07:49:38
【问题描述】:

我在视图控制器中加载电话联系人时遇到了小问题,我成功地在Tableview 中加载了我的电话联系人,其中包含姓名和号码,但是联系人随机加载姓名,我希望联系人姓名必须是字母顺序,等于号码

这是我的示例代码:

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

}

【问题讨论】:

标签: ios swift contacts


【解决方案1】:

我从您的代码中假设您的 contactArray 设置了如下值:

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

要按名称排序,您可以使用sort method

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]]

【讨论】:

  • 是否可以按字母顺序对它们进行分类,以便我们可以在表格视图部分中列出它们?
  • 我不明白您所说的categorize them alphabetically 是什么意思?你能举一个具体的例子或更详细地解释你的问题吗? @Satyam
【解决方案2】:

你可以使用:

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

【讨论】:

  • 因为它是一个 NsArray,我如何在调用它之后删除所有对象?
  • contactArray = nil 或 contactArray = NSArray() 。这取决于将来的使用
【解决方案3】:

你也可以使用简洁的 Swifty 排序方式(当然,如果你使用的是 Swift Array 而不是 NSArray)

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

【讨论】:

  • 大坝使用 NsMutableArray 作为contactArray
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多