1
私はプログラムでテーブルビューに検索バーを設定し、検索バーにスコープバーを追加しました。私は、ユーザーがスコープボタンの1つをタップするときに正しい情報を表示する方法を理解しようとしています。たとえば、「Sweet」スコープボタンをタップすると、データモデルのsweetに関連付けられているすべての果物のみが表示されます。これまでのコードです:Swift 3:プログラム的に機能するスコープバー
私はプログラムでテーブルビューに検索バーを設定し、検索バーにスコープバーを追加しました。私は、ユーザーがスコープボタンの1つをタップするときに正しい情報を表示する方法を理解しようとしています。たとえば、「Sweet」スコープボタンをタップすると、データモデルのsweetに関連付けられているすべての果物のみが表示されます。これまでのコードです:Swift 3:プログラム的に機能するスコープバー
まず、filterContentsforSearchText
メソッドを更新してください。 searchText
が空の場合は、すぐにcategoryMatch
を返す必要があります:
func filterContentsforSearchText(searchText: String, scope: String = "All"){
filteredFruits = fruits.filter { fruit in
let categoryMatch = (scope == "All") || (fruit.category == scope)
if searchText.isEmpty {
return categoryMatch
}
return categoryMatch && fruit.name.lowercased().contains(searchText.lowercased())
}
myTable.reloadData()
}
はその後、すべての
searchController.searchBar.text != ""
文を削除、あなたが任意のより多くのそれらを必要としません。
最終的なコード:
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 {
return filteredFruits.count
}
return fruits.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
fruitName = fruits[indexPath.row].name
let cell = myTable.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let fruit: Fruits
if searchController.isActive {
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)
if searchText.isEmpty {
return categoryMatch
}
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])
print("selectedScope: \(selectedScope)")
if selectedScope == 1{
print("Sweet")
}
}
}
そして、あなたが期待どおりに働いています!
あなたの方法は機能しますが、私は小さな問題がありました。たとえば、 の場合、テーブルビューには8つの項目があります。最後の4つのアイテムをフィルタリングするためにスコープを使用すると、最後の4つのアイテムが正しく表示されますが、セルをクリックすると、最初の4つのアイテムの情報が表示されます。ビューコントローラがセグメンテーションするときに正しい情報を表示する方法がありますか? – Geniouse
'tableView(_:didSelectRowAt:)'メソッドを使用して、 'tableView(_:cellForRowAt:)'メソッドと同じように選択した果物を取得する必要があります。今、あなたは確かに果物の情報を持っています。あなたはセグを実行するか、その果実を渡すことによって何かをすることができます。 –