如何使UITextField在Swift中表现得像UISearchBar?

Mar*_*ida 10 uitextfield uisearchbar uisearchbardelegate swift ios8

大家好我正在使用UITableView和Swift中的UISearchBar开发新的应用程序,它已经正常工作了.但由于最终项目必须有一个完整的自定义搜索栏,因此我不得不移动到UITextField作为输入Outlet,因为它具有自定义功能.

问题是我无法弄清楚如何编码,以便UITextField的行为类似于UISearchBar.不知道如何过滤UITextField输入并使字符串可用于UISearchBarDelegate方法.

所以任何人都可以帮我解决这个问题?

编辑:我跟随丹尼尔的帮助,并提出了这个代码,但它返回"零",没有工作.

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate {

@IBOutlet weak var txtSearchBar: UITextField!
var searchTxt = ""
let prods = ["água", "terra", "ar", "fogo"]
var searchResults:[String] = []

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    txtSearchBar.delegate = self
}


func textFieldDidEndEditing(textField: UITextField) {
    searchTxt = textField.text
    println(searchTxt)
    searchResults = prods.filter({(produtos:String) -> Bool in

        let nameMatch = produtos.rangeOfString(self.searchTxt, options: NSStringCompareOptions.CaseInsensitiveSearch)

        println(nameMatch)
        return nameMatch != nil})
}
Run Code Online (Sandbox Code Playgroud)

我的输入是字母"ar",但它返回"nil",因为它不应该是因为其中一个数组的对象是"ar".

Jay*_*iya 11

创建uitextfield对象:

@IBOutlet var SearchTxt: UITextField!
var search:String=""

@IBOutlet var ListTable: UITableView!
var AllData:Array<Dictionary<String,String>> = []
var SearchData:Array<Dictionary<String,String>> = []
Run Code Online (Sandbox Code Playgroud)

viewDidLoad中:

override func viewDidLoad()
{
    super.viewDidLoad()

    AllData = [["pic":"list0.jpg", "name":"Angel Mark", "msg":"Hi there, I would like read your...", "time":"just now", "unread":"12"],
               ["pic":"list1.jpg", "name":"John Doe", "msg":"I would prefer reading on night...", "time":"56 second ago", "unread":"2"],
               ["pic":"list2.jpg", "name":"Krishta Hide", "msg":"Okey Great..!", "time":"2m ago", "unread":"0"],
               ["pic":"list3.jpg", "name":"Keithy Pamela", "msg":"I am waiting there", "time":"5h ago", "unread":"0"]
               ]

    SearchData=AllData
}
Run Code Online (Sandbox Code Playgroud)

在textfield委托方法中搜索:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
{
    if string.isEmpty
    {
        search = String(search.characters.dropLast())
    }
    else
    {
        search=textField.text!+string
    }

    print(search)
    let predicate=NSPredicate(format: "SELF.name CONTAINS[cd] %@", search)
    let arr=(AllData as NSArray).filtered(using: predicate)

    if arr.count > 0
    {
        SearchData.removeAll(keepingCapacity: true)
        SearchData=arr as! Array<Dictionary<String,String>>
    }
    else
    {
        SearchData=AllData
    }
    ListTable.reloadData()
    return true
}
Run Code Online (Sandbox Code Playgroud)

在tableview中显示搜索数据:

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! ListCell

    var Data:Dictionary<String,String> = SearchData[indexPath.row]

    cell.Pic.image=UIImage(named: Data["pic"]!)
    cell.Name.text = Data["name"]
    cell.Msg.text = Data["msg"]
    cell.Time.text = Data["time"]

    cell.selectionStyle = .none
    return cell
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ida 1

在@Daniel T.的帮助下,我设法用以下代码解决了这个问题:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    isFiltered = true
    searchResults = prods.filter({(coisas:String) -> Bool in
        let stringMatch = coisas.rangeOfString(textField.text)
        return stringMatch != nil

    })
    println(searchResults.description)
    textField.resignFirstResponder()
    table.reloadData()
    return true
}
Run Code Online (Sandbox Code Playgroud)

谢谢@丹尼尔·T。