使用带有 JSON 的 UISearchbar 来过滤结果
Using UISearchbar with JSON to filter the result
我在以下代码中使用 http 从 JSON 获取数据:
我有一个 ObjectModel、DownloadModelProtocol 和 TableViewController
(Modal.swift)
class OrderItemModal: NSObject {
var deptname: String!
var staffname: String!
var status: String!
var userid: String!
}
(下载订单Modal.swift):
protocol OrderDownloadProtocol: class {
func itemsDownload(items: Array<Any>)
}
...
let bmsOrders = NSMutableArray()
...
weak var delegate: OrderDownloadProtocol!
let urlPath = "http://localhost/production/api/db_orders.php"
func downloadItems() {
let url = URL(string: urlPath)!
let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)
...
for i in 0..<jsonResult.count
{
jsonElement = jsonResult[i] as! NSDictionary
let bmsOrder = OrderItemModal()
....
bmsOrders.add(bmsOrder)
....
声明:
var orderItems = [OrderItemModal]()
var filterArray= [OrderItemModal]()
func itemsDownload(items: Array<Any>) {
orderItems = items as! [OrderItemModal]
}
和 viewDidLoad:
let bmsOrder = DownloadOrderModal()
bmsOrder.delegate = self
bmsOrder.downloadItems()
这是 JSON 结果:
(
{
"deptname" = "Production";
"staffname" = Warehouse;
"status" = 1;
"userid" = ware;
})
这是搜索条码
filterArray = orderItems.filter( { ([=16=]. staffname) (of: searchText, options: .caseInsensitive) })
最后,这是错误:
无法将类型“[OrderItemModal]”的值分配给类型“[String]”
最终,我会将数据填充到 table。
你有一些问题。 orderItems
似乎是一个 NSArray
数组 OrderItemModal
值。您需要做的第一件事是停止使用 NSArray
并使用适当类型的 Swift 数组。在这种情况下,它应该是 [OrderItemModal]
。您需要确保 filterArray
也被声明为 [OrderItemModal]
.
此类数组的过滤器结果将是 OrderItemModal
的数组,但您试图将结果强制转换为 String
.
的数组
您也将闭包强制转换为 (Any) -> Bool
。没必要。
最后,您不必要地使用 NSString
。坚持 String
.
您只需要:
filterArray = orderItems.filter { (item) -> Bool in
return item.staffname.range(of: searchText, options: .caseInsensitive) != nil
}
更简单:
filterArray = orderItems.filter { [=11=].staffname.range(of: searchText, options: .caseInsensitive) != nil }
我在以下代码中使用 http 从 JSON 获取数据:
我有一个 ObjectModel、DownloadModelProtocol 和 TableViewController
(Modal.swift)
class OrderItemModal: NSObject {
var deptname: String!
var staffname: String!
var status: String!
var userid: String!
}
(下载订单Modal.swift):
protocol OrderDownloadProtocol: class {
func itemsDownload(items: Array<Any>)
}
...
let bmsOrders = NSMutableArray()
...
weak var delegate: OrderDownloadProtocol!
let urlPath = "http://localhost/production/api/db_orders.php"
func downloadItems() {
let url = URL(string: urlPath)!
let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)
...
for i in 0..<jsonResult.count
{
jsonElement = jsonResult[i] as! NSDictionary
let bmsOrder = OrderItemModal()
....
bmsOrders.add(bmsOrder)
....
声明:
var orderItems = [OrderItemModal]()
var filterArray= [OrderItemModal]()
func itemsDownload(items: Array<Any>) {
orderItems = items as! [OrderItemModal]
}
和 viewDidLoad:
let bmsOrder = DownloadOrderModal()
bmsOrder.delegate = self
bmsOrder.downloadItems()
这是 JSON 结果:
(
{
"deptname" = "Production";
"staffname" = Warehouse;
"status" = 1;
"userid" = ware;
})
这是搜索条码
filterArray = orderItems.filter( { ([=16=]. staffname) (of: searchText, options: .caseInsensitive) })
最后,这是错误:
无法将类型“[OrderItemModal]”的值分配给类型“[String]”
最终,我会将数据填充到 table。
你有一些问题。 orderItems
似乎是一个 NSArray
数组 OrderItemModal
值。您需要做的第一件事是停止使用 NSArray
并使用适当类型的 Swift 数组。在这种情况下,它应该是 [OrderItemModal]
。您需要确保 filterArray
也被声明为 [OrderItemModal]
.
此类数组的过滤器结果将是 OrderItemModal
的数组,但您试图将结果强制转换为 String
.
您也将闭包强制转换为 (Any) -> Bool
。没必要。
最后,您不必要地使用 NSString
。坚持 String
.
您只需要:
filterArray = orderItems.filter { (item) -> Bool in
return item.staffname.range(of: searchText, options: .caseInsensitive) != nil
}
更简单:
filterArray = orderItems.filter { [=11=].staffname.range(of: searchText, options: .caseInsensitive) != nil }