1
我已經設置了一個搜索欄到我的表格視圖編程,並添加一個範圍欄到搜索欄。我試圖弄清楚當用戶點擊一個範圍按鈕時如何顯示正確的信息。例如,如果他們點擊「甜」範圍按鈕,它只會顯示與數據模型中的甜點相關的所有水果。這是我到目前爲止的代碼:Swift 3:以編程方式運行的範圍欄
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchResultsUpdating {
@IBOutlet weak var myTable: UITableView!
var fruits = [Fruits]()
var filteredFruits = [Fruits]()
var selectIndex: IndexPath = IndexPath()
var fruitName: String!
var myArray = ["All", "Sweet", "Fresh", "Other"]
var sweets = [String]()
var searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
fruits = [
Fruits(category: "Fresh", name: "Apple"),
Fruits(category: "Fresh", name: "Strawberry"),
Fruits(category: "Sweet", name: "Mango"),
Fruits(category: "Sweet", name: "Cherry"),
Fruits(category: "Sweet", name: "Grapes"),
Fruits(category: "Other", name: "Orange"),
Fruits(category: "Sweet", name: "Banana"),
Fruits(category: "Fresh", name: "Tomatoe"),
]
myTable.delegate = self
myTable.dataSource = self
searchController.dimsBackgroundDuringPresentation = false
self.definesPresentationContext = true
searchController.searchResultsUpdater = self
searchController.searchBar.scopeButtonTitles = ["All", "Sweet", "Fresh", "Other"]
searchController.searchBar.delegate = self
myTable.tableHeaderView = searchController.searchBar
searchController.searchBar.barTintColor = UIColor.white
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchController.isActive && searchController.searchBar.text != "" {
return filteredFruits.count
}
return fruits.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
fruitName = fruits[indexPath.row].name
let cell = myTable.dequeueReusableCell(withIdentifier: cellID, for: indexPath)
let fruit: Fruits
if searchController.isActive && searchController.searchBar.text != ""{
fruit = filteredFruits[indexPath.row]
} else {
fruit = fruits[indexPath.row]
}
if fruits[indexPath.row].category == "Sweet"{
sweets = [fruits[indexPath.row].category]
print(sweets)
}
cell.textLabel?.text = fruit.name
cell.detailTextLabel?.text = fruit.category
return cell
}
//SearchBar
func updateSearchResults(for searchController: UISearchController) {
let searchBar = searchController.searchBar
let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex]
filterContentsforSearchText(searchText: searchController.searchBar.text!, scope: scope)
}
func filterContentsforSearchText(searchText: String, scope: String = "All"){
filteredFruits = fruits.filter { fruit in
let categoryMatch = (scope == "All") || (fruit.category == scope)
return categoryMatch && fruit.name.lowercased().contains(searchText.lowercased())
}
myTable.reloadData()
}
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
filterContentsforSearchText(searchText: searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope])
if selectedScope == 1{
print("Sweet")
}
}
}
你的方法效果!但是我有一個小問題。例如, 表格視圖上有8個項目。如果我使用範圍來過濾最後四個項目,它會正確顯示最後四個項目,但是當我單擊單元格時,它會顯示前四個項目的信息。當視圖控制器出現故障時,是否有另外一種方式讓我顯示正確的信息? – Geniouse
您應該使用'tableView(_:didSelectRowAt:)'方法,並像方法'tableView(_:cellForRowAt:)'一樣檢索選中的水果。現在,你有一個正確的水果信息。您可以通過傳遞水果來執行賽格或做某事。 –