我正在使用 Swift 开发一个iOS应用程序,我正在使用 NSMutableArray ,当我尝试将UISearchController添加到我的UITableViewController它给我这个错误< / p>
但是当我尝试用NSArray做它时效果很好。
如果您想知道为什么我使用NSMutableArray? 因为我需要它将UITableViewController中所选行中的NSMutableArray的对象传递给另一个UIViewController,如下所示: 1.2 click here, please
我现在要做什么,如何添加搜索栏? 提前谢谢。
答案 0 :(得分:0)
你可以通过将可变数组转换为nsarray然后使用它来破解它。
你在1.1中做的事情只是在self.businessNamesArray行之前加上这行
var regArray = self.businessNamesArray as NSArray as! [字符串]
然后将self.businessNamesArray行更改为regArray.filter {此处的其余代码
答案 1 :(得分:0)
如果您使用常规Swift数组,我认为这是正确的想法,因为您使用Swift,如果您更改数组变量类型并修复数组过滤语法,则可以使其正常工作。首先,将数组声明更改为:
var BusinessNamesArray:[String]?
您在filter
上使用的self.BusinessNamesArray
函数会返回一个已过滤的数组,而不是将数组过滤掉(这就像您想要的那样)。如果您要替换self.BusinessNamesArray
的内容,则需要执行以下操作:
func updateSearchResultsForSearchController(searchController: UISearchController) {
self.BusinessNamesArray = self.BusinessNamesArray.filter { (business:String) -> Bool in
return true
// You probably want to compare strings here like this instead:
// guard let searchText = searchController.searchBar.text else {
// return false
// }
// return business.hasPrefix(searchText)
}
// You probably also need to reload your table view at this point:
self.tableView.reloadData()
}
请注意,您的BusinessNamesArray
现已过滤,但您无法对其进行过滤。相反,你应该保留你的第二个字符串数组,如searchResults
。然后,您可以使用它来过滤并维护原始数组中的原始业务名称列表。因此,您将添加一个名为var searchResults:[String]?
的类变量,搜索过滤代码将更改为。
func updateSearchResultsForSearchController(searchController: UISearchController) {
self.searchResults = self.BusinessNamesArray.filter { (business:String) -> Bool in
guard let searchText = searchController.searchBar.text else {
return false
}
return business.hasPrefix(searchText)
}
self.tableView.reloadData()
}
此时在您的表格视图上调用reloadData
时,您可能需要检查并查看您的搜索控制器是否在表格视图委托numberOfSectionsInTableView
以及其他内容中处于活动状态委托函数并使用searchResults
数组(如果它处于活动状态)和BusinessNamesArray
(如果它不是) - 例如:
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
if (self.resultSearchController.active) {
return self.searchResults.count ?? 0
} else {
return self.BusinessNamesArray.count ?? 0
}
}
(self.resultSearchController
变量是UISearchController
的本地实例。我不确定您的名字是什么。)
然后,您将使用类似的代码来确定要为prepareForSegue:
代码抓取的项目:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Guard your variables here so you can return early if they're
// not valid
guard let upcoming = segue.destinationViewController as? DetailsViewController,
myindexpath = self.tableView.indexPathForSelectedRow else {
return
}
var titleString = ""
if (self.resultSearchController.active) {
if let searchResults = self.searchResults {
titleString = searchResults[myindexpath.row]
}
} else {
if let businessNames = self.BusinessNamesArray {
titleString = businessNames[myindexpath.row]
}
}
upcoming.titleString = titleString
self.deselectRowAtIndexPath(myindexpath, animated: true)
}