Получить строку поиска в панели навигации в Swift
Итак, я пробовал все, чтобы найти панель поиска в панели навигации в Swift. Но, к сожалению, я не работал, пока...
Для тех из вас, кто не знает, о чем я говорю, я пытаюсь сделать что-то вроде этого
![enter image description here]()
Обратите внимание на панель поиска на панели навигации. Итак, вот что я сейчас использую
self.searchDisplayController?.displaysSearchBarInNavigationBar = true
Я вытащил это в моем viewDidLoad
, а затем, когда загрузил приложение, которое мне представлено, просто пустая панель навигации....:( Любые идеи?
Ответы
Ответ 1
Попробуй это
let leftNavBarButton = UIBarButtonItem(customView:Yoursearchbar)
self.navigationItem.leftBarButtonItem = leftNavBarButton
Обновить
Вы сохраняете ленивую собственность UISearchBar
lazy var searchBar:UISearchBar = UISearchBar(frame: CGRectMake(0, 0, 200, 20))
В viewDidLoad
searchBar.placeholder = "Your placeholder"
var leftNavBarButton = UIBarButtonItem(customView:searchBar)
self.navigationItem.leftBarButtonItem = leftNavBarButton
Если вы хотите использовать раскадровку, просто перетащите панель поиска в качестве розетки, а затем замените свойство lazy на панель поиска розетки.
Ответ 2
// create the search bar programatically since you won't be
// able to drag one onto the navigation bar
searchBar = UISearchBar()
searchBar.sizeToFit()
// the UIViewController comes with a navigationItem property
// this will automatically be initialized for you if when the
// view controller is added to a navigation controller stack
// you just need to set the titleView to be the search bar
navigationItem.titleView = searchBar
Ответ 3
В вашем представлении контроллер:
lazy var searchBar = UISearchBar(frame: CGRectZero)
override func viewDidLoad() {
super.viewDidLoad()
searchBar.placeholder = "Search"
navigationItem.titleView = searchBar
}
Сделав это, установив navigationItem.titleView, панель поиска автоматически центрируется по всем устройствам iPhone и iPad. Примечание: проверено только с v8.4 и v9.0
для SWIFT 3
lazy var searchBar = UISearchBar(frame: CGRect.zero)
Ответ 4
let searchBar = UISearchBar()
searchBar.sizeToFit()
searchBar.placeholder = ""
self.navigationController?.navigationBar.topItem?.titleView = searchBar
Ответ 5
Для iOS 11 и выше
navigationItem.searchController = searchController
![enter image description here]()
Для iOS 10 и ниже
navigationItem.titleView = searchController.searchBar;
![enter image description here]()
или вы можете назначить его как leftBarButtonItem, как описано в этом ответе
Ответ 6
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.endEditing(true)
searchBar.text = nil
print("## search btn clicked : \(searchBar.text ?? "")")
}
Ответ 7
Для Свифта 4 и 5.
let searchBar = UISearchBar() self.navigationItem.titleView = searchBar
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: nil)
cancelButton.tintColor = #colorLiteral
searchBar.tintColor = #colorLiteral
self.navigationItem.rightBarButtonItem = cancelButton
Ответ 8
Установка SearchBar в качестве titleView, изменяет высоту navigationBar на 56. Чтобы это исправить, вы можете встроить searchBar в представление и установить его как titleView.
var offset: CGFloat = 20
// If VC is pushed, back button should be visible
if navigationController?.navigationBar.backItem != nil {
offset = 40
}
let customFrame = CGRect(x: 0, y: 0, width: view.frame.size.width - offset, height: 44.0)
let searchBarContainer = UIView(frame: customFrame)
searchBar = UISearchBar(frame: customFrame)
searchBarContainer.addSubview(searchBar)
navigationItem.titleView = searchBarContainer
Ответ 9
В 2019 году вы должны использовать UISearchController.
override func viewDidLoad() {
super.viewDidLoad()
let searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self.viewModel
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search artists"
self.navigationItem.searchController = searchController
self.definesPresentationContext = true
}
И какой-то класс должен соответствовать UISearchResultsUpdating. Я обычно добавляю это как расширение к моей ViewModel.
extension ArtistSearchViewModel: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
print("Searching with: " + (searchController.searchBar.text ?? ""))
let searchText = (searchController.searchBar.text ?? "")
self.currentSearchText = searchText
search()
}
}
Это создаст что-то вроде этого:
![search bar]()
Ответ 10
Для Свифта 4 и 5.
Вставьте ваш View Controller в навигационный контроллер
let searchBar = UISearchBar()
self.navigationItem.titleView = seachBar
[Here is a screenshot.][1]
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action:
cancelButton.tintColor = #colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha:
searchBar.tintColor = #colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha:
self.navigationItem.rightBarButtonItem = cancelButton