1
프로그래밍 방식으로 내 테이블보기에 검색 막대를 설정하고 검색 막대에 범위 막대를 추가했습니다. 사용자가 범위 단추 중 하나를 두 드릴 때 올바른 정보를 표시하는 방법을 알아 내려고합니다. 예를 들어, "Sweet"범위 버튼을 누르면, 데이터 모델의 단 과일과 관련된 모든 과일 만 표시됩니다. 지금까지 내 코드 :Swift 3 : 프로그래밍 방식으로 작동하는 스코프 막대
프로그래밍 방식으로 내 테이블보기에 검색 막대를 설정하고 검색 막대에 범위 막대를 추가했습니다. 사용자가 범위 단추 중 하나를 두 드릴 때 올바른 정보를 표시하는 방법을 알아 내려고합니다. 예를 들어, "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 :)'메소드와 같은 방식으로 선택된 과일을 가져와야합니다. 자, 당신은 정확한 열매의 정보를 가지고 있습니다. 당신은 segue를 수행하거나 그 과일을지나 무언가를 할 수 있습니다. –