2016-04-08 47 views
0

概述: 我試圖讓一個搜索欄根據輸入文本搜索不同的屬性。例如,如果我的地址簿中包含「姓名」和「數字」,我希望搜索欄上的字符串可以搜索「姓名」,如果在搜索欄中輸入了Int,則可以搜索「Numbers」。 (就像iPhone的Phone應用程序)採取使用RealmSearchViewController搜索多個屬性

步驟:

1)我已經實現了RealmSearchViewController一拉境界的教程。 (https://realm.io/news/building-an-ios-search-controller-in-swift/

2)我已經計算出如何通過初始化指定searchPropertyKeyPath屬性。 (見下文,如果它可以幫助任何人)

所需的init(編碼器aDecoder:NSCoder){ super.init(編碼器:aDecoder) self.searchPropertyKeyPath = 「******中國」 打印( 「你好」) 打印( 「搜索欄:」,self.searchBar.text) }

問題: 我不能制定瞭如何一個)掃描searchbar.text [判斷是否是int或字符串]和則b )修改searchPropertyKeyPath [來搜索相應的屬性]。

關於如何去做這件事的任何意見? (我的猜測是重寫,然後修改RealmSwiftViewController文件中的refreshSearchResults()函數。是的,我已經嘗試過,但遇到了編碼問題,我不想在這個問題中提出這個問題)

+0

我找不到解決方案,沒有分叉庫和編寫NSPredicate函數,我希望。 – bcamur

回答

1

領域使用NSPredicate查詢,並NSPredicate輕易允許查詢使用NSCompoundPredicate多個屬性:

class Person: Object { 
    dynamic var name = "John" 
    dynamic var phoneNumber = "1-800-DINOSAUR" 
} 
let searchString = "John" 
let subpredicates = ["name", "phoneNumber"].map { property in 
    NSPredicate(format: "%K CONTAINS %@", property, searchString) 
} 
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: subpredicates) 
let johnInNameOrNumber = realm.objects(Person).filter(predicate) 

要了解更多關於NSPredicate的語法,你應該參考Realm's NSPredicate Cheatsheet

0

我的答案是一種解決方法,但它應該工作正常。您創建一個包含您可能想要搜索的所有信息的屬性,然後將其作爲搜索屬性。

我們假設您的聯繫人正在從CSV創建,並且您已將某個CSV信息獲取到結構中。爲了簡單起見,我拋棄了對領域的任何參考。

class Contact: Object { 
    var name = "" 
    var number = 0 
    var fullInfo = "" 
} 

struct ContactInfo { 
    var name: String 
    var number: Int 
} 

func createContact(from info: ContactInfo) { 
    var newContact = Contact() // your Object subclass 
    newContact.name = info.name 
    newContact.number = info.number 
    newContact.fullInfo = "\(info.name) - \(String(info.number))" 
} 

然後您將searchPropertyfullInfo

請注意,雖然很容易使fullInfo爲計算屬性,但這不起作用,因爲您無法獲得searchProperty的計算屬性。