我有这个数据库结构:
Users
userid1
username : username1
otherdata : otherdata1
userid2
username : username2
otherdate : otherdata2
我正在寻找的是当一个用户在表格视图顶部使用uisearchbar时,在tableview中显示我的用户的用户名。这就是我到目前为止所拥有的:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
ref = Database.database().reference()
let strSearch = searchBar.text
ref.child("Users").queryOrdered(byChild: "username").queryStarting(atValue: strSearch).queryEnding(atValue: strSearch! + "\u{f8ff}").observeSingleEvent(of: .value, with: { (snapshot) in
var fetchedList = snapshot.value as! [AnyObject]
for obj in fetchedList {
print(obj["username"] as? String)
}
}) { (err) in
print(err)
}
}
但是我被卡住了,因为它没有显示用户名,我的应用程序一直在崩溃,在我运行之前我得到了这个警告: "表达式隐含地来自' String?'任何" 当我用Xcode修复它时:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
ref = Database.database().reference()
let strSearch = searchBar.text
ref.child("Users").queryOrdered(byChild: "username").queryStarting(atValue: strSearch).queryEnding(atValue: strSearch! + "\u{f8ff}").observeSingleEvent(of: .value, with: { (snapshot) in
let fetchedList = snapshot.value as! [AnyObject]
for obj in fetchedList {
print(obj["username"] as Any)
}
}) { (err) in
print(err)
}
}
我的应用程序崩溃不起作用。有人能告诉我我做错了什么。
答案 0 :(得分:1)
当我运行您的代码时,我收到以下错误:
Could not cast value of type 'NSNull' (0x11202a570) to 'NSArray' (0x112029d78).
所以我有几点建议:
快照可能为空,因此请务必使用if let
或guard
语句处理此问题。
使用snapshot.children.allObjects
进行迭代,而不是snapshot.Value
,无法转换为数组。
另外,作为旁注,您可以将searchText
参数传递给查询,而不是使用searchBar.text
。
结果将是这样的:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
ref = Database.database().reference()
ref.child("Users").queryOrdered(byChild: "username").queryStarting(atValue: searchText).queryEnding(atValue: searchText + "\u{f8ff}").observeSingleEvent(of: .value, with: { (snapshot) in
// cast to an array of DataSnapshots
guard let fetchedList = snapshot.children.allObjects as? [DataSnapshot] else { return }
// iterate through array, cast value to dictionary
for obj in fetchedList {
let objDict = obj.value as! [String: AnyObject]
print(objDict["username"])
}
}) { (err) in
print(err)
}
}