【问题标题】:How to Use Text Field for Search?如何使用文本字段进行搜索?
【发布时间】:2017-09-06 15:25:30
【问题描述】:

我有一个项目,人们可以在创建集合视图项时分配一个词,并且可以使用他们分配给集合视图项的该词在另一个视图中搜索它,例如:某人创建了项目并将其命名为“牛奶” ' 然后使用工作杂货,以便他们以后可以搜索。

我正在使用 CoreData,并在使用属性创建集合视图项时保存该词,这就是我的代码如何查找在创建集合视图单元格的位置填充的文本字段:

@IBAction func doneTran(_ sender: UIButton) {

    if textFieldT.text != "" {


        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        let task = Task(context: context)

        task.name = textFieldT.text!

        task.desc = descBox.text!

        task.hashtag = hashtagField.text!

        task.pid = pidStore

        (UIApplication.shared.delegate as! AppDelegate).saveContext()

        // Saves info to CoreData
    }

主题标签是存储要搜索的术语的标签。然后我有一个新的视图控制器,可以使用主题标签字符串在其中搜索项目。它使用一个 textField 和一个 UIButton 来重新加载视图并根据它们的标签属性是否与 textField 文本匹配来显示项目。这就是我实现它的方式:

@IBOutlet weak var resultsColl: UICollectionView!

@IBOutlet weak var textFieldFHash: UITextField!

var taskTwo : [Task] = []

var activeCell : HashCollectionViewCell!

var testHashAt = String()

override func viewDidLoad() {
    super.viewDidLoad()

    self.resultsColl.delegate = self
    self.resultsColl.dataSource = self

    testHashAt = textFieldFHash.text!
}


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    getData()
    resultsColl.reloadData()

    testHashAt = textFieldFHash.text!
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return taskTwo.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let taskTHash = taskTwo[indexPath.row]

    let cellHash = collectionView.dequeueReusableCell(withReuseIdentifier: "nCell", for: indexPath) as! HashCollectionViewCell

    if testHashAt == taskTHash.hashtag {
        cellHash.labelFHash?.text = taskTHash.name
    }
    else {
        print("blank cell?")
    }

    if cellHash.labelFHash.text == "" {
        print("cell is nil")
    }

    cellHash.layer.cornerRadius = 25

    return cellHash
}

@IBAction func searchHashBtn(_ sender: UIButton) {
    getData()
    resultsColl.reloadData()
}

func getData() {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    do {
        let fetchRequest: NSFetchRequest<Task> = Task.fetchRequest()
        fetchRequest.predicate = NSPredicate.init(format: "hashtag = %@", testHashAt);
        taskTwo = try context.fetch(fetchRequest)
    }

    catch {
        print("Get Data failed")
    }

    // Fetches data.
}

这就是视图控制器中用于搜索的所有代码,但是当我搜索该术语时,什么也没有出现。我不确定这是否是搜索按钮实际上没有重新加载视图以显示单元格或者搜索功能通常不起作用的问题。有谁知道如何根据他们的标签属性来显示正确的项目?

【问题讨论】:

标签: ios swift core-data uicollectionview


【解决方案1】:

试试下面的代码:

import UIKit

class TDSearchVC: UIViewController ,   UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate{


@IBOutlet var textSearch: UITextField!
@IBOutlet var tblSearchResult: UITableView!

var arrData : [String] = []
var arrFilterData : [String] = []
var isSearch : Bool!


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    isSearch = false

    arrData = ["Apple", "Banana", "Chikoo", "Brew", "Cherry", "Mango", "Lotus", "Peacock", "Temple", "Pine Apple","Glass", "Rose", "Church", "Computer", "Carrot"]

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK:- textfield

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{

    var searchText  = textField.text! + string

    if string  == "" {
        searchText = (searchText as String).substring(to: searchText.index(before: searchText.endIndex))
    }

    if searchText == "" {
        isSearch = false
        tblSearchResult.reloadData()
    }
    else{
        getSearchArrayContains(searchText)
    }

    return true
}

// Predicate to filter data
func getSearchArrayContains(_ text : String) {
    var predicate : NSPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", text)
    arrFilterData = (arrData as NSArray).filtered(using: predicate) as! [String]
    isSearch = true
    tblSearchResult.reloadData()
}

// MARK:- TableView Delegates
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{

    if isSearch! {
        return arrFilterData.count
    }
    else{

        return arrData.count
    }
}

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

    var cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell

    if isSearch! {
        cell.textLabel?.text = arrFilterData[indexPath.row]
    }
    else{

        cell.textLabel?.text = arrData[indexPath.row]
    }
    return cell
}
}

【讨论】:

    【解决方案2】:

    如果您想使用 TextField 搜索 tableView 中的任何单词。你可以使用

    func textFieldDidChangeSelection(_ textField: UITextField)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2014-12-25
      • 1970-01-01
      相关资源
      最近更新 更多