2014-12-12 1 views
1

Я хочу, чтобы он работал именно так. http://i.imgur.com/M1JigDY.pngUISearchDisplayController in Swift

У меня есть панель навигации с левой и правой панелью. Левая панель - кнопка поиска. Нажатие этой кнопки приводит меня к этому методу.

@IBAction func searchMap(sender: AnyObject) { 

    self.navigationItem.rightBarButtonItem = nil 
    var searchDispCont = UISearchDisplayController(searchBar: searchBar, contentsController: nil) 
    self.navigationController?.navigationBar.addSubview(searchDispCont.searchBar) 

    searchDispCont.searchBar.showsCancelButton = true 
    searchDispCont.searchBar.tintColor = UIColor.lightGrayColor() 
    searchDispCont.displaysSearchBarInNavigationBar = true 
    searchDispCont.searchBar.becomeFirstResponder() 
    searchDispCont.setActive(true, animated: true) 
} 

Когда нажата кнопка отмены строки поиска, она возвращается к исходному навигационному контроллеру.

func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
    // Need to go back to original state 
    searchBar.hidden = true 

    var listBtn = UIBarButtonItem(title: "List", style: UIBarButtonItemStyle.Plain, target: self, action: "goToList:") 
    self.navigationItem.setRightBarButtonItem(listBtn, animated: false) 

    var searchBtn = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: "searchMap:") 
    self.navigationItem.setLeftBarButtonItem(searchBtn, animated: false) 
} 

Кнопка списка работает правильно. Однако нажатие кнопки поиска снова не возвращает меня к методу searchMap(), как должно. Он удаляет левую навигационную панель, не показывает ли панель поиска. Это потому, что я уже создал searchDisplayController?

У меня также такая же проблема после того, как я искал карту. После того, как я искал карту, панель поиска исчезает, как и должна, но у меня такая же проблема, когда я снова нажимаю кнопку поиска. Вот этот метод.

func searchBarSearchButtonClicked(searchBar: UISearchBar!) 
{ 
    var listBtn = UIBarButtonItem(title: "List", style: UIBarButtonItemStyle.Plain, target: self, action: "goToList:") 
    self.navigationItem.setRightBarButtonItem(listBtn, animated: false) 

    var searchBtn = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: "searchMap:") 
    self.navigationItem.setLeftBarButtonItem(searchBtn, animated: false) 

    searchBar.resignFirstResponder() 
    var found = false 
    for bar in bars { 
     var barName = bar.name.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil) 
     var searchString = searchBar.text.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil) 

     var test = bar as BarAnnotation 
     if barName.rangeOfString(searchString) != nil || barName.lowercaseString.rangeOfString(searchString.lowercaseString) != nil { 
      found = true 
      var span = MKCoordinateSpanMake(0.005, 0.005) 
      var region = MKCoordinateRegion(center: test.location, span: span) 
      mapView.setRegion(region, animated: true) 
      mapView.selectAnnotation(bar.annotation, animated: true) 
     } 
    } 

    if found { 
     // Need to go back to original state 

     searchBar.hidden = true 
     searchBar.text = "" 
    } 
    else{ 
     let alert = UIAlertView() 
     alert.title = "Not Found" 
     alert.message = "Not found. Please try your search again." 
     alert.addButtonWithTitle("OK") 
     alert.show() 

     searchBar.text = "" 
    } 
} 

Любые идеи?

BONUS: Есть ли способ динамически изменять размер панели поиска в зависимости от телефона? Когда я инициализируюсь его, я сказал

var searchBar = UISearchBar(frame: CGRectMake(0, 0, 300, 20)) as UISearchBar 

Но это не будет правильные значениями для iPhone 6.

ответ

1

не могу поверить, что я не видел этого, но мне просто нужно

searchBar.hidden = false 

в методе SearchMap(). У меня по-прежнему возникают проблемы с поиском динамического изменения размера, если у кого-то есть какие-либо советы по этому поводу.

+0

Привет @leerob Я реализовал то же самое, но когда я нажимаю кнопку отмены, он не вызывает метод searchBarCancelButtonClicked. В строке поиска результатов не скрывается кнопка отмены нажатия. – Daljeet

+0

@Daljeet Я считаю, что вам нужно настроить делегат поиска в любом классе, в котором вы работаете, чтобы он мог распознать, когда нажата кнопка отмены. – leerob

+0

Я уже добавил делегатов UISearchControllerDelegate, UISearchBarDelegate. – Daljeet

0

Вы можете назначить свою панель поиска searchBar.sizeToFit() и динамически изменить размер панели поиска для разных устройств.

+0

Я также обнаружил, что установка параметра searchBar в navigationBar.title и отсутствие параметров размера сделает его автоматическим изменением размера. – leerob