结合使用UISearchbar和JSON来过滤结果

时间:2018-09-03 02:59:41

标签: swift uisearchbar

我在以下代码中使用http从JSON提取数据:

我有一个ObjectModel,DownloadModelProtocol和TableViewController

(Modal.swift)

class OrderItemModal: NSObject {
    var deptname: String!
    var staffname: String!
    var status: String!
    var userid: String!
}

(DownloadOrderModal.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( { ($0. staffname) (of: searchText, options: .caseInsensitive) })

最后,这是错误:

无法将类型为[[OrderItemModal]]的值分配为类型为[[String]]

最终,我将数据填充到表中。

1 个答案:

答案 0 :(得分:1)

您遇到了一些问题。看来orderItemsNSArray值的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 { $0.staffname.range(of: searchText, options: .caseInsensitive) != nil }