Использование UISearchbar с JSON для фильтрации результатов - PullRequest
0 голосов
/ 03 сентября 2018

Я получаю данные из JSON, используя http в следующем коде:

У меня есть 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 голосов
/ 03 сентября 2018

У вас есть несколько вопросов. Кажется, что 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 { $0.staffname.range(of: searchText, options: .caseInsensitive) != nil }
...