大家好我正在使用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})
}
我的输入是字母“ar”,但它返回“nil”,因为它不应该是因为其中一个数组的对象是“ar”。
答案 0 :(得分:2)
您的主要问题似乎是询问如何实现一个像UISearchBar一样工作的类。那将是一项艰巨的任务!
但是,在您的笔记中,您只需询问如何对点按的搜索按钮作出反应。
将IBAction和第二个数组添加到视图控制器。将第二个数组称为“foundItems”。将IBAction连接到搜索按钮。调用操作时,从文本字段中读取文本并根据该文本过滤项目。将符合过滤器的项放在foundItems数组中,然后在表视图上调用reloadData()。
在表视图数据源方法中,检查foundItems是否为nil。如果不是,则显示它们而不是主项目数组。
您还需要某种取消按钮。在该按钮的操作中,将findItems数组清零并在表视图上调用reloadData()。
答案 1 :(得分:1)
Xcode 9.2 / Swift 4 - 工作代码
@IBOutlet var tfSearchWorker: UITextField!
@IBOutlet var tblView: UITableView!
var AllData :Array<Dictionary<String,String>> = []
var SearchedData:Array<Dictionary<String,String>> = []
@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"]
]
self.SearchedData = self.AllData
self.tfSearchWorker.addTarget(self, action: #selector(searchWorkersAsPerText(_ :)), for: .editingChanged)
@Function
@objc func searchWorkersAsPerText(_ textfield:UITextField) {
self.SearchedData.removeAll()
if textfield.text?.count != 0 {
for dicData in self.AllData {
let isMachingWorker : NSString = (dicData.name!) as NSString
let range = isMachingWorker.lowercased.range(of: textfield.text!, options: NSString.CompareOptions.caseInsensitive, range: nil, locale: nil)
if range != nil {
SearchedData.append(dicData)
}
}
} else {
self.SearchedData = self.AllData
}
self.tblView.reloadData()
}
@UITableView
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.SearchedData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! ListCell
var Data:Dictionary<String,String> = SearchedData[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
}
答案 2 :(得分:0)
在@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
}
谢谢@Daniel T。