Swift更改SearchBar的“No Results”標籤和“Cancel”按鈕

weixin_33866037發表於2015-06-16

今天要實現一個基於 TableView 的搜尋,基於經驗沿用了 iOS7 時代的 UISearchDisplayController,XCODE 一直提示我改用 UISearchController 。先不管這個,說說碰到的修改 Cancel 按鈕和修改 No Results 文字的問題。

修改 Cancel 按鈕比較簡單,直接通過 Controller 找到該 UINavigationButton 即可,最好的修改位置當然是在 searchDisplayControllerWillBeginSearch 方法。

func searchDisplayControllerWillBeginSearch(controller: UISearchDisplayController) {
    self.searchDisplayController?.searchBar.showsCancelButton = true
    
    var cancelButton: UIButton?
    var topView: UIView = controller.searchBar.subviews[0] as! UIView
    for view in topView.subviews  {            
        if view.isKindOfClass(NSClassFromString("UINavigationButton")){
            cancelButton =  view as? UIButton
        }
    }
    if (cancelButton != nil) {
        cancelButton?.setTitle("取消", forState: UIControlState.Normal)
        cancelButton?.setTitleColor(UIColor.appBlueColor(), forState: UIControlState.Normal)            
    }
    
}

修改 “No Results”就比較討厭,雖然思路類似,但是找了一圈都沒有直接找到該 UILabel,UISearchResultsUpdating 協議帶的方法
updateSearchResultsForSearchController 也不可以。最後還是在 StackOverFlow 找到了解決方案。
原帖:http://stackoverflow.com/questions/8447086/uisearchdisplaycontroller-no-results-text

 func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String!) -> Bool {
  
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(0.01)
        ),
        dispatch_get_main_queue(), {
            
            for view in self.searchDisplayController?.searchResultsTableView.subviews as! [UIView]{
                if view.isKindOfClass(NSClassFromString("UILabel")){
                    let label = view as! UILabel
                    label.text = "沒有匹配"
                }
                
            }
    })
    
    return true
}

還是準備使用 SearchController 了,看到那麼多 WARNING 就忍不了。

相關文章