외부 API의 항목 카탈로그를 검색하기 위해 UISearchBar를 구현했습니다. 검색 기능은 예상대로 작동하지만 문제는 검색 막대 텍스트 필드의 오른쪽에있는 취소 버튼을 누를 때마다 전체 검색 막대가 한 행 아래로 내려 가고 전체를 푸시하는 것처럼 보입니다. 아래 테이블보기.취소 버튼을 누를 때마다 검색 막대가 한 행 아래로 점프합니다.
검색 막대 텍스트 필드에 문자를 입력 한 다음 취소를 누르면 검색 막대 텍스트 필드가 행 높이 인 44 픽셀만큼 아래로 이동하고 테이블보기 자체도 같은 양만큼 내립니다 . 계속해서 무언가를 입력 한 다음 취소를 누르면 검색 창이보기 아래로 더 멀리 이동합니다. 어떤 충고라도 좋을 것입니다! viewDidLoad
에 configureSearchController()
를 호출하는
import Foundation
import UIKit
import ItemLogger
private extension Selector {
static let dismiss = #selector(SearchVC.dismissView)
}
extension SearchVC: UISearchResultsUpdating {
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchBar = searchController.searchBar
let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex]
filterContentForSearchText(searchController.searchBar.text!, scope: scope)
}
}
extension SearchVC: UISearchBarDelegate {
func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
filterContentForSearchText(searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope])
}
}
class SearchVC: UITableViewController {
let searchController = UISearchController(searchResultsController: nil)
var searchedItems = [ItemLog]()
var searchedImages = [UIImage]()
override func viewDidLoad() {
super.viewDidLoad()
let leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "Back_Button"), style: UIBarButtonItemStyle.Plain, target: self, action: .dismiss)
self.navigationItem.leftBarButtonItem = leftBarButtonItem
}
override func viewWillAppear(animated: Bool) {
configureSearchController()
}
override func prefersStatusBarHidden() -> Bool {
return true
}
func configureSearchController() {
guard !searchController.active else {
return
}
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Type to Search"
definesPresentationContext = true
searchController.searchBar.scopeButtonTitles = ["All"]
searchController.searchBar.delegate = self
searchController.searchBar.sizeToFit()
tableView.tableHeaderView = searchController.searchBar
let view: UIView = self.searchController.searchBar.subviews[0] as UIView
for subView: UIView in view.subviews {
if let textView = subView as? UITextField {
textView.tintColor = UIColor.orangeColor()
textView.textColor = UIColor.blackColor()
textView.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.05)
}
}
searchController.searchBar.barTintColor = UIColor.whiteColor()
let cancelButtonAttributes: NSDictionary = [NSForegroundColorAttributeName: UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.33)]
UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes as? [String : AnyObject], forState: UIControlState.Normal)
}
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
tableView.reloadData()
}
override func tableView(tableView:UITableView, numberOfRowsInSection section: Int) -> Int {
if searchController.active && searchController.searchBar.text != "" {
return searchedItems.count
}
return 0
}
override func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("items", forIndexPath: indexPath)
let label = cell.viewWithTag(111) as! UILabel
let nameLabel = cell.viewWithTag(222) as! UILabel
let art = cell.viewWithTag(333) as! UIImageView
if searchController.active && searchController.searchBar.text != "" && searchController.searchBar.text != NSCharacterSet.whitespaceCharacterSet(){
label.text = searchedItems[indexPath.row].title
nameLabel.text = searchedItems[indexPath.row].name
art.image = searchedImages[indexPath.row]
}
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print(searchedItems[indexPath.row])
self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
func filterContentForSearchText(searchText: String, scope: String = "All") {
if searchController.active && searchController.searchBar.text != "" && searchController.searchBar.text != NSCharacterSet.whitespaceCharacterSet() {
let queries: [SearchQueryOptions] = [
.QueryString(searchController.searchBar.text!)]
ItemLog.search(queries, completion: { (result) in
if let itms = result.response.result where itms.count > 0 {
self.searchedItems.removeAll()
self.searchedImages.removeAll()
for i in 0...itms.count - 1 {
self.searchedItems.append(itms[i])
self.searchedImages.append(itms[i].img)
}
}
self.tableView.reloadData()
})
}
}
func dismissView(){
self.navigationController?.popToRootViewControllerAnimated(true)
}
}
질문을 스토리 보드 및 런타임 결과로 업데이트하십시오. –
@MikeG 내 대답을 확인하십시오 ... – Joe