在TableView

时间:2018-04-12 10:38:33

标签: ios swift realm

我想实现一个反向查找功能。 如何通过2个不同的UITextField查询来自领域的数据。

有一个名为Items的领域类,它具有名为ingredient1ingredient 6的属性。我想过滤基于ingredientName1的textField上的用户输入到成分6.如果键入的值用户匹配任何这些属性,则应该过滤变量项。

我的代码:

let realm = try! Realm()
var items : Results<Items>?

@IBOutlet weak var ingredient1: UITextField!
@IBOutlet weak var ingredient2: UITextField!
@IBOutlet weak var tableView: UITableView!

当用户完成输入并点击按钮时。我希望刷新TableView,并在其上列出结果(本例中的配方)。

@IBAction func searchButton(_ sender: UIButton) {

    tableView.reloadData()
}

func textFieldDidEndEditing(_ textField: UITextField) {

    if (ingredient1.text != "" && ingredient2.text == "") {
        items = items?.filter("ingredientName1 || ingredientName2 || ingredientName3 || ingredientName4 || ingredientName5 || ingredientName6 CONTAINS[cd] %@", ingredient1)
        print(ingredient1.text!)


    } else if (ingredient1.text == "" && ingredient2.text != "") {
        print("Enter Ingredient on Ingredient1 first")

    } else if (ingredient1.text != "" && ingredient2.text != "") {
        items = items?.filter("ingredientName1 CONTAINS[cd] %@ || ingredientName2 CONTAINS[cd] %@ || ingredientName3 CONTAINS[cd] %@ || ingredientName4 CONTAINS[cd] %@ || ingredientName5 CONTAINS[cd] %@ || ingredientName6 CONTAINS[cd] %@", ingredient1.text!, ingredient2.text!)
        print("\(ingredient1.text!) \(ingredient2.text!)")
    }


}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()
    return true
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return items?.count ?? 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "searchedItemCell", for: indexPath)

    cell.textLabel?.text = items?[indexPath.row].itemName ?? "No items Found"

    return cell

}

此代码不会抛出任何错误,但我会在触发textFieldDidEndEditing时假设有任何值的项目为零。然后tableView保持空白。

1 个答案:

答案 0 :(得分:0)

首先,您需要填充result = new Float32Array(256); dataView = new DataView(fileBuffer.buffer.slice(2880)); byteNum = startByte; for (let i = 0; i < result.length; i++) { result[i] = dataView.getFloat32(byteNum); byteNum = byteNum + Float32Array.BYTES_PER_ELEMENT; } 数组,如下所示:

items

items = realm.objects(Items.self) 中调用此方法。 之后更改过滤字符串,如下所示:

viewDidLoad

您必须传递与过滤字符串中的let ingredient1Text = ingredient1.text ?? "" items = items?.filter("ingredientName1 CONTAINS %@ || ingredientName2 CONTAINS %@ || ingredientName3 CONTAINS %@ || ingredientName4 CONTAINS %@ || ingredientName5 CONTAINS %@ || ingredientName6 CONTAINS %@", ingredient1Text, ingredient1Text, ingredient1Text, ingredient1Text, ingredient1Text, ingredient1Text) 值一样多的参数。

例如,如果您想要按两个字符串进行过滤,则可以编写如下内容:

%@