2016-11-20 1 views
0

나는 이것을 두 시간 동안 풀려고 노력했다. 저는 IOS에서 초보자이며 검색 창으로 버킷 목록을 개발하려고합니다. 코드는 컴파일시 문제가 없지만 검색 창에 입력하면 검색 결과가 표시되지 않습니다. 문제가 어디 있는지 모르겠습니다.검색 막대가 작동하지 않는 이유는 무엇입니까?

btw : 두 명의 용의자가 있습니다 : 1. 상태를 인쇄하려했는데 searchBar가 활성화되지 않은 것 같습니다. 어떻게 열지? 2. var mission의 데이터 type과 관련이 있습니까? 내가 익숙하지 않은 것입니다.

다음과 같은 코드를 참조하십시오 : 당신이 공유 한 프로젝트에서

import UIKit 

class BucketListViewController:UITableViewController, MissionDetailsViewControllerDelegate, MissionEditViewControllerDelegate, UISearchBarDelegate{ 

    var searchController = UISearchController(searchResultsController: nil) 
    @IBOutlet weak var searchBar: UISearchBar! 

    var searchActive : Bool = false 
    var filtered:[String] = [] 
    var missions:[String] = ["Sky diving", "Live in Hawaii"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     searchBar.delegate = self 
     self.searchDisplayController!.searchResultsTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "MyCell") 
    } 

    func searchBarTextDidBeginEditing(searchBar: UISearchBar) { 
     searchActive = true; 
    } 

    func searchBarTextDidEndEditing(searchBar: UISearchBar) { 
     searchActive = false; 
    } 

    func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
     searchActive = false; 
    } 

    func searchBarSearchButtonClicked(searchBar: UISearchBar) { 
     searchActive = false; 
    } 

    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 

     filtered = missions.filter({ (text) -> Bool in 
      let tmp: NSString = text 
      let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) 
      return range.location != NSNotFound 
     }) 
     if(filtered.count == 0){ 
      searchActive = false; 
     } else { 
      searchActive = true; 
     } 
     self.tableView.reloadData() 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     // dequeue the cell from our storyboard 
     let cell = tableView.dequeueReusableCellWithIdentifier("MyCell")! 
     if(searchActive){ 
      print("search active!") 
      cell.textLabel?.text = filtered[indexPath.row] 
     } else { 
      cell.textLabel?.text = missions[indexPath.row] 
     } 
     return cell 
    } 


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if(searchActive){ 
      return filtered.count 
     } else { 
      return missions.count 
     } 
    } 



    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "AddNewMission" { 
      let navigationController = segue.destinationViewController as! UINavigationController 
      let controller = navigationController.topViewController as! MissionDetailsViewController 
      controller.delegate = self 
     } 
     if segue.identifier == "EditMission" { 
      let navigationController = segue.destinationViewController as! UINavigationController 
      let controller = navigationController.topViewController as! MissionEditViewController 
      controller.delegate = self 
     } 
    } 


    func missionDetailsViewController(controller: MissionDetailsViewController, didFinishAddingMission mission: String) { 
     dismissViewControllerAnimated(true, completion: nil) 
     missions.append(mission) 
     tableView.reloadData()} 

    func missionEditViewController(controller: MissionEditViewController, didFinishEditingMission mission: String, atIndexPath indexPath: Int) { 
     dismissViewControllerAnimated(true, completion: nil) 
     missions[indexPath] = mission 
     tableView.reloadData() 

    } 
} 

PICTURE ON WORKING ERROR OF SEARCH BAR

+0

아마도 검색 바는 스토리 보드에 함께 IBOutlet에 올바르게 연결된되지 않는 이유는 무엇입니까? –

+0

@IBOutlet 약한 var searchBar : UISearchBar로 연결했다고 생각합니다! 그것을 어떻게 확인할 수 있습니까? – marshall

+0

@marshall은'textDidChange' 메서드가 호출되는 것을 확인 했습니까? – Rajat

답변

0

당신의 cellForRowAtIndexPath 방법에 문제가있다.

cell.textLabel?.text = filtered[indexPath.row].details 

cell.textLabel?.text = filtered[indexPath.row] as? String 

를 교체하고 그것을 잘 작동합니다.

귀하의 전체 코드는 다음과 같습니다

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    // dequeue the cell from our storyboard 
    let cell = tableView.dequeueReusableCellWithIdentifier("MissionCell")! 
    // if the cell has a text label, set it to the model that is corresponding to the row in array 
    if(searchActive){ 
     print("search active!") 
     cell.textLabel?.text = filtered[indexPath.row].details 
    } else { 
     cell.textLabel?.text = missions[indexPath.row].details 
    } 
    return cell 
} 
+0

그것은 작동합니다. 정말 고마워! – marshall

+1

작동하는 경우 대답을 수락하십시오. :) –

관련 문제