使用带有 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 }