2017-09-13 9 views
0

검색 표시 줄이 있습니다. 이제 검색 텍스트가 배열의 항목과 일치하지 않을 때 표를 지우는 데 도움이 필요합니다. 빈 검색 창).결과가 일치하지 않을 때 검색 막대 필터가 표를 지우지 않습니다.

"일치하는 결과가 없습니다"와 같은 일치 항목이 발견되지 않으면 셀 중 하나에 메시지가 표시되기를 바랍니다. 나는이 검색 창 기능을 만드는 가장 좋은 방법은 아니라는 것을 알고

@IBOutlet var searchForTool: UISearchBar! 
@IBOutlet var toolTable: UITableView! 

var searchActive : Bool = false 
    { 
    didSet { 
     if searchActive != oldValue { 
      toolTable?.reloadData() 
     } 
    } 
} 

typealias Item = (data: String, identity: String) 

var filtered: [Item] = [] 
var items: [Item] = [ 
    (data: " Data1", identity: "A"), (data: " Data2", identity: "B") 
] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.navigationController?.setNavigationBarHidden(true, animated: false) 

    AppState.shared.category = "Alphabetical" 

} 

@IBAction func backButton(_ sender: Any) { 

    if let navController = self.navigationController { 
     for controller in navController.viewControllers { 
      if controller is ToolsViewController { 
       navController.popToViewController(controller, animated: true) 
      } 
     } 
    } 
} 

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

    filtered = items.filter { item in 
     item.data.localizedCaseInsensitiveContains(searchText) 
    } 

    searchActive = !filtered.isEmpty 

    self.toolTable.reloadData() 

} 

func numberOfSections(in tableView: UITableView) -> Int { 

    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if(searchActive) { 
     return filtered.count 
    } 

    return items.count 

} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell 

    cell.alphabeticalLabel.layer.masksToBounds = true 

    if(searchActive) { 
     cell.alphabeticalLabel.text = filtered[indexPath.row].data 
     cell.alphabeticalLabel.layer.cornerRadius = 10 
    } else { 
     cell.alphabeticalLabel.text = items[indexPath.row].data 
     cell.alphabeticalLabel.layer.cornerRadius = 10 
    } 

    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let vcName: String 
    if searchActive { 
     vcName = filtered[indexPath.row].identity 
    } else { 
     vcName = items[indexPath.row].identity 
    } 
    let viewController = storyboard?.instantiateViewController(withIdentifier: vcName) 
    self.navigationController?.pushViewController(viewController!, animated: true) 
} 
} 

,하지만 내가 잠시 동안 함께 일한지 무엇을 :

여기 내 코드입니다. 솔루션은별로 복잡하지는 않겠지 만, 난 그저 운이 좋지 않을뿐입니다.

도움을 주시면 감사하겠습니다. 검색 텍스트가 비어 있거나없는 경우

+0

나는 나머지 로직이 예상대로 작동한다고 가정합니다. 'items.count' 대신에'! searchActive'가 있으면'numberOfRowsInSection'에 0을 반환하지 않는 것이 어떻습니까? 아니면 1을 반환하고 'cellForRowAtIndexPath'에서'alphabeticallyLabel'을 "No results found"로 설정하십시오? – leandrodemarco

+0

@leandrodemarco, 문제는, 만약 내가 그렇게하면, 처음에는 테이블에 아무것도 입력하지 않을 때까지 테이블이 비어 있다는 것입니다. 테이블이 비어 있어야하는 유일한 타입은 검색 바에 잘못된 것이 입력되었을 때입니다. –

답변

1

는 귀하의 회신을 바탕으로, 확인하기 위해 검사를 추가

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if(searchActive) { 
     return filtered.count 
    } 
    else if (searchForTool.text? == "") { // check if this is "" or nil 
     return items.count 
    } 
    else { 
     return 0 // Or 1 if you want to show a cell with "no found" text 
    } 
} 

당신은 유사 cellForRowAtIndexpath을 조정해야합니다. 검색 막대의 텍스트 속성이 nil이거나 사용자가 아무 것도 입력하지 않은 경우 빈 문자열을 확인하십시오.

+0

네, 잘 작동합니다. searchForTool.text 옵션을 선택해야만했습니다. 그렇지 않으면 오류가 발생했습니다. 그리고 그에 따라 cellForRowAtIndexpath를 수정했습니다. 감사! –