我需要一点帮助。 祝大家平安,希望你们做得很好。
我用表格 View 制作了一个应用程序,我想向我的表格 View 添加一个搜索栏,所以我找到了一个如何将搜索栏添加到表格 View 的教程,但在教程中它只是一个包含项目的列表,而不是当你输入那些将您移动到带有 TextView 的 View Controller 的项目。与教程不同,我的应用程序是这样的,当您键入其中一项时,它们会将您移动到带有 TextView 的 View Controller 。但更好的是你可以看到我的 tablview 的样子: [![在此处输入图像描述][1]][1]
它看起来不错,当我使用搜索栏时它也看起来不错:
[![在此处输入图像描述][2]][2]
但问题是,当您使用搜索时,它会为我提供来自不同变量的不同数据,如图所示: [![在此处输入图像描述][3]][3]
希望我说得很清楚,并希望有人能向我解释如何解决这个问题。
和平。
这是我的 tablview 代码:
import UIKit
class TableViewController: UITableViewController, UISearchResultsUpdating {
var FirstTableArray = [String]()
var passThisArray = [String]()
var filteredVerbs = [String]()
var resultSearchController = UISearchController()
override func viewDidLoad() {
super.viewDidLoad()
self.resultSearchController = UISearchController(searchResultsController: nil)
self.resultSearchController.searchResultsUpdater = self
self.resultSearchController.dimsBackgroundDuringPresentation = false
self.resultSearchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = self.resultSearchController.searchBar
self.tableView.reloadData()
// This array will display on your tableviewcell.
FirstTableArray = [åadlyde, åanbefale, åansette, åarbeide, åavslå, åavstå, åbade, åbanke, åbarbere, åbe, åbearbeide, åbedra, åbedøve, åbegynne, åbehandle, åbeite, åbeskrive, åbestemme…]
//You can pass element of this array
passThisArray = ["å adlyde", "å anbefale", "å ansette", "å arbeide", "å avslå", "å avstå", "å bade", "å banke", "å barbere", "å be", "å bearbeide", "å bedra", "å bedøve", "å begynne", "å behandle"…]
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int
{
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if(passThisArray.count > 3){
if (self.resultSearchController.active)
{
return self.filteredVerbs.count;
}
else
{
return self.passThisArray.count
}
}
return FirstTableArray.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let Cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
Cell.textLabel?.text = passThisArray[indexPath.row]
if (self.resultSearchController.active)
{
Cell.textLabel?.text = self.filteredVerbs[indexPath.row]
return Cell
}
else
{
Cell.textLabel?.text = self.passThisArray[indexPath.row]
return Cell
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "detailView") {
let vc = segue.destinationViewController as! ViewwController
//Get the Index of selected Cell
var indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!
//assign string to next view controller instance from selected cell.
vc.FirstString = FirstTableArray[indexPath.row]
if (self.resultSearchController.active) {
vc.FirstString = FirstTableArray[filteredVerbs.count]
}
}
}
func updateSearchResultsForSearchController(searchController: UISearchController)
{
self.filteredVerbs.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
let array = (self.passThisArray as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredVerbs = array as! [String]
self.tableView.reloadData()
}
}
最佳答案
所以看来你的问题出在这个方法上,在所选的行中:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "detailView") {
let vc = segue.destinationViewController as! ViewwController
//Get the Index of selected Cell
var indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!
//assign string to next view controller instance from selected cell.
vc.FirstString = FirstTableArray[indexPath.row]
if (self.resultSearchController.active) {
vc.FirstString = FirstTableArray[filteredVerbs.count] // <<---
}
}
}
如果搜索处于事件状态,您应该以 self.filteredVerbs[indexPath.row]
的方式获取 FirstString
。
根据评论了解: 似乎没有简单的方法可以在这两个数组中存储的值之间进行映射。
此外,这也不是存储这些数据的理想方式。它不灵活,并且将数据与表示混合在一起,通常应该避免这种情况。我建议创建一个结构来存储数据,如下所示:
class Flexion : NSObject {
var infinitiv:String = ""
var presens:String = ""
var preteritum:String = ""
var perfektum:String = ""
var english:String = ""
init(infinitiv:String, presens:String, preteritum:String, perfektum:String, english:String) {
self.infinitiv = infinitiv
self.presens = presens
self.preteritum = preteritum
self.perfektum = perfektum
self.english = english
}
}
您的情况的主要好处是只有一个包含 TableView 来源对象的数组。整个事情也会变得更具可读性,并且更容易进一步维护。
所以你原来问题的代码将变成这样:
class TableViewController: UITableViewController, UISearchResultsUpdating {
var FirstTableArray = [Flexion]()
var filteredVerbs = [Flexion]()
var resultSearchController = UISearchController()
override func viewDidLoad() {
super.viewDidLoad()
self.resultSearchController = UISearchController(searchResultsController: nil)
self.resultSearchController.searchResultsUpdater = self
self.resultSearchController.dimsBackgroundDuringPresentation = false
self.resultSearchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = self.resultSearchController.searchBar
//create your objects like this :
var åadlyde = Flexion(infinitiv: "å adlyde", presens: "adlyder", preteritum: "adlød", perfektum: "har adlydt", english: "obey")
//create the rest of them
FirstTableArray = [åadlyde, åanbefale, åansette, åarbeide, åavslå, åavstå, åbade, åbanke, åbarbere, åbe, åbearbeide, åbedra, åbedøve, åbegynne, åbehandle, åbeite, åbeskrive, åbestemme…]
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (self.resultSearchController.active) {
return self.filteredVerbs.count
}
return FirstTableArray.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let Cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
if (self.resultSearchController.active) {
let verb = self.filteredVerbs[indexPath.row] as Flexion
Cell.textLabel?.text = verb.infinitiv
} else {
let verb = self.FirstTableArray[indexPath.row] as Flexion
Cell.textLabel?.text = verb.infinitiv
}
return Cell
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "detailView") {
let vc = segue.destinationViewController as! UIViewController
var indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!
if (self.resultSearchController.active) {
vc.verb = filteredVerbs[indexPath.row]
} else {
vc.verb = FirstTableArray[indexPath.row]
}
}
}
func updateSearchResultsForSearchController(searchController: UISearchController) {
self.filteredVerbs.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF.infinitiv CONTAINS[c] %@", searchController.searchBar.text!)
let array = (self.FirstTableArray as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredVerbs = array as! [Flexion]
self.tableView.reloadData()
}
}
您还需要在 "detailView"
View Controller 中进行必要的更改 - 添加 Flexion
类型的 verb
变量并更改向用户呈现数据的方式。
这样,数组之间就不需要这种“映射”了。
注意:请注意 NSPredicate
中的更改 - 它现在将仅检查单词的 infinitiv
版本。
关于ios - 搜索和表格 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33895546/