2016-10-11 2 views
8

외부 API의 항목 카탈로그를 검색하기 위해 UISearchBar를 구현했습니다. 검색 기능은 예상대로 작동하지만 문제는 검색 막대 텍스트 필드의 오른쪽에있는 취소 버튼을 누를 때마다 전체 검색 막대가 한 행 아래로 내려 가고 전체를 푸시하는 것처럼 보입니다. 아래 테이블보기.취소 버튼을 누를 때마다 검색 막대가 한 행 아래로 점프합니다.

검색 막대 텍스트 필드에 문자를 입력 한 다음 취소를 누르면 검색 막대 텍스트 필드가 행 높이 인 44 픽셀만큼 아래로 이동하고 테이블보기 자체도 같은 양만큼 내립니다 . 계속해서 무언가를 입력 한 다음 취소를 누르면 검색 창이보기 아래로 더 멀리 이동합니다. 어떤 충고라도 좋을 것입니다! viewDidLoadconfigureSearchController()를 호출하는

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

} 
+0

질문을 스토리 보드 및 런타임 결과로 업데이트하십시오. –

+0

@MikeG 내 대답을 확인하십시오 ... – Joe

답변

7

코드 참고

스위프트 3. 테스트 오픈 소스 프로젝트를 만들었어요 : 내가 코드를하려고하면. 나는 같은 문제에 직면했다. 어떻게 든, 나는

class SearchVC: UITableViewController,UISearchBarDelegate,UISearchResultUpdating { 

var resultSearchController = UISearchController() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    configureSearchController() 
} 


override var prefersStatusBarHidden: Bool { 

    return true 
} 


func configureSearchController() { 

    self.resultSearchController = ({ 
     let controller = UISearchController(searchResultsController: nil) 
     controller.searchResultsUpdater = self 
     controller.dimsBackgroundDuringPresentation = false 
     controller.hidesNavigationBarDuringPresentation = false 
     controller.searchBar.searchBarStyle = .default 
     controller.searchBar.sizeToFit() 
     controller.searchBar.setShowsCancelButton(false, animated: true) 
     controller.searchBar.keyboardAppearance = .default 

     self.tableView.tableHeaderView = controller.searchBar 

     //controller.searchBar.tintColor = UIColor(patternImage: UIImage(named: "xxxx")!) 
     // controller.searchBar.setBackgroundImage(UIImage(named: "xxxx"), forBarPosition: UIBarPosition.Top, barMetrics: UIBarMetrics.Default) 
     // controller.searchBar.backgroundImage = UIImage(named: "xxxx") 
     // controller.searchBar.setImage(UIImage(named: "search-icon.png"), forSearchBarIcon: UISearchBarIcon.Search, state: UIControlState.Normal) 

     return controller 
    })() 


    for subView in self.resultSearchController.searchBar.subviews 
    { 
     for subsubView in subView.subviews 
     { 
      if let textField = subsubView as? UITextField 
      { 
       textField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Search Text", comment: ""), attributes: [NSForegroundColorAttributeName: UIColor.red]) 

       textField.adjustsFontSizeToFitWidth = true 
       textField.allowsEditingTextAttributes = true 


       textField.textColor = UIColor.red 
       textField.layer.borderColor = UIColor.gray.cgColor 
       textField.layer.cornerRadius = 5 
       textField.layer.masksToBounds = true 

       textField.layer.borderWidth = 0.215 

      } 
     } 
     } 
    } 
} 

업데이트 ... 해결하기 위해 관리 : .... code..hope 위에서

func updateSearchResults(for searchController: UISearchController) {} 

출력, 내 대답은 당신의 문제가 해결됩니다 enter image description here

+0

굉장! 조금 테스트 한 후 searchBar'scope'를 사용하여 무언가를 발견했습니다. 확실한 것은 정확히 무엇인지는 모르지만 당신의 대답과 약간의 함의 조합이 트릭을 만들었습니다. 고마워. – MikeG

0

시도 : 여기 내 코드입니다. viewWillAppearsuper.viewWillAppear(animated:)으로 전화하는 것을 잊지 마십시오.

+0

아 좋은 생각! 불행히도 여전히 같은 문제가 있습니다 – MikeG

0

나는 SearchTableView

self.searchController.searchBar.sizeToFit() 
self.tableHeaderView = self.searchController.searchBar 

searchTableView.layoutMargins = UIEdgeInsets.zero 
definesPresentationContext = true 
extendedLayoutIncludesOpaqueBars = true 
관련 문제