如何使用NSMutableArray和UISearchController进行过滤

时间:2016-04-14 18:08:11

标签: ios xcode swift nsmutablearray uisearchcontroller

我正在使用 Swift 开发一个iOS应用程序,我正在使用 NSMutableArray ,当我尝试将UISearchController添加到我的UITableViewController它给我这个错误< / p>

1.1 click here, please

但是当我尝试用NSArray做它时效果很好。

如果您想知道为什么我使用NSMutableArray? 因为我需要它将UITableViewController中所选行中的NSMutableArray的对象传递给另一个UIViewController,如下所示: 1.2 click here, please

我现在要做什么,如何添加搜索栏? 提前谢谢。

2 个答案:

答案 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)
}