概述: 我试图让一个搜索栏根据输入文本搜索不同的属性。例如,如果我有一个带有“姓名”和“数字”的地址簿,我希望搜索栏上的字符串搜索“名称”,如果在搜索栏中输入了Int,则搜索“数字”。 (就像iPhone的手机应用程序一样)
采取的步骤:
1)我已经在Realm的教程中实现了RealmSearchViewController。 (https://realm.io/news/building-an-ios-search-controller-in-swift/)
2)我已经研究了如何通过初始化分配searchPropertyKeyPath属性。 (如果对任何人有帮助,请参见下文)
必需的init?(编码器aDecoder:NSCoder){ super.init(编码器:aDecoder) self.searchPropertyKeyPath =“PhoneNumber” 打印(“你好”) print(“Searchbar:”,self.searchBar.text) }
问题: 我无法弄清楚如何a)扫描searchbar.text [检查它是否为int或string]然后b)修改searchPropertyKeyPath [以搜索相应的属性]。
关于如何解决此问题的任何观点?
(我的猜测是覆盖然后修改RealmSwiftViewController文件中的refreshSearchResults()函数。是的,我试过这个,但遇到了编码问题,我不想在这个问题中提出来)
答案 0 :(得分:4)
Realm使用Changerequest.joins{[changerequest_statuses, subquery.as('max_status').on { id == max_status.changerequest_id}]}
进行查询,NSPredicate
可以轻松使用NSPredicate
查询多个属性:
NSCompoundPredicate
要了解有关NSPredicate语法的更多信息,请参阅Realm's NSPredicate Cheatsheet。
答案 1 :(得分:0)
感谢那些回复的人,我的解决方案是不使用RealmSearchViewController,而是使用Realm的谓词与xcode的UISearchController一起使用本教程:https://www.raywenderlich.com/113772/uisearchcontroller-tutorial。
答案 2 :(得分: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))"
}
然后将searchProperty
设置为fullInfo
。
请注意,尽管将fullInfo
作为计算属性很诱人,但这不起作用,因为您不能拥有searchProperty
的计算属性。