【问题标题】:Search for multiple Properties with RealmSearchViewController使用 RealmSearchViewController 搜索多个属性
【发布时间】:2016-07-30 09:08:12
【问题描述】:

概述: 我试图让一个搜索栏根据输入文本搜索不同的属性。例如,如果我有一个包含“姓名”和“号码”的通讯录,我希望在搜索栏中有一个字符串来搜索“姓名”,如果在搜索栏中输入了一个 Int,则可以搜索“号码”。 (就像 iPhone 的电话应用)

采取的步骤:

1) 我已经按照 Realm 的教程实现了 RealmSearchViewController。 (https://realm.io/news/building-an-ios-search-controller-in-swift/)

2) 我已经弄清楚如何通过初始化分配 searchPropertyKeyPath 属性。 (如果对任何人有帮助,请参见下文)

需要初始化?(coder aDecoder: NSCoder) { super.init(编码器:aDecoder) self.searchPropertyKeyPath = "电话号码" 打印(“你好”) print("搜索栏:", self.searchBar.text) }

问题: 我不知道如何 a) 扫描 searchbar.text [以检查它是 int 还是 string],然后 b) 修改 searchPropertyKeyPath [以搜索适当的属性]。

对如何解决这个问题有任何看法吗?

(我的猜测是覆盖然后修改 RealmSwiftViewController 文件中的 refreshSearchResults() 函数。是的,我已经尝试过了,但是遇到了编码问题,我不想在这个问题中提出)

【问题讨论】:

  • 如果不分叉存储库并按照我的意愿编写 NSPredicate 函数,我找不到解决方案。

标签: ios realm


【解决方案1】:

我的回答是一种解决方法,但应该可以正常工作。您创建一个包含您可能想要搜索的所有信息的属性,然后将其作为搜索属性。

假设您的联系人是从 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))"
}

然后将searchProperty 设置为fullInfo

请注意,虽然将 fullInfo 设为计算属性很诱人,但这不会起作用,因为您不能为 searchProperty 提供计算属性。

【讨论】:

    【解决方案2】:

    感谢那些回复的人,我的解决方案是使用 RealmSearchViewController,而是使用 Realm 的谓词和 xcode 的 UISearchController,如本教程:https://www.raywenderlich.com/113772/uisearchcontroller-tutorial

    【讨论】:

    • 我也遇到了这个问题,你能告诉我你是如何解决搜索多个值的吗?
    【解决方案3】:

    Realm 使用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

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 2012-12-05
      • 1970-01-01
      • 2012-08-02
      • 2014-11-02
      • 2013-01-23
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      相关资源
      最近更新 更多