- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个搜索栏,当您单击“搜索”(也在导航栏中)时,它会出现在导航栏的顶部。单击搜索结果会将您带到详细信息页面,搜索栏将在该页面消失。当您单击返回主页 VC 时,搜索栏会重新出现。以为这很简单,但遇到了一些问题。这是我到目前为止所做的
要在 HomeVC 中点击“搜索”时创建搜索栏,我这样做了:
@IBAction func SearchAction(sender: AnyObject) {
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
definesPresentationContext = true
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
self.navigationController?.presentViewController(searchController, animated: true, completion: nil)
}
第一个问题,当您转到详细信息页面时,搜索栏不会消失。
解决方案:在PrepareForSegue中,我添加了
self.searchController.searchBar.removeFromSuperview()
并用委托(delegate)替换了 unwindSegue,以便当用户从详细信息页面返回到 Home VC 时,搜索栏会重新添加。HomeVC 执行以下操作:
func didDismissDetail() {
self.navigationController?.popViewControllerAnimated(true)
if searchController.active == true {
self.navigationController?.view.addSubview(searchController.searchBar)
}
}
问题二:搜索的场景有bug,点击进入详情页面,返回首页VC,点击取消关闭搜索 Controller 。当您再次单击导航栏中的搜索按钮时,没有任何反应。我收到此错误:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图以模态方式呈现事件 Controller 。”解决方案:我加了这个
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
self.searchController.searchBar.removeFromSuperview()
}
然而,这有效,当 View 被移除时没有动画。抱歉,我知道这有点啰嗦 - 我的问题是:
如果不是,您如何在用户点击“取消”时以动画方式移除搜索栏
以下是一些图片:
最佳答案
而不是使用 self.searchController.searchBar.removeFromSuperview()
你应该使用:
navigationController?.dismissViewControllerAnimated(true, completion: nil)`
关闭 View 。另外,你应该给你的 segue 一个标识符并在 prepareForSegue
中检查它。 .您的实现可能看起来像这样:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ToDetail" {
let destination = segue.destinationViewController as! DetailViewController
navigationController?.dismissViewControllerAnimated(true, completion: nil)
//Pass Info to Detail View
}
}
然后在didSelectRowAtIndexPath
只需使用 performSegueWithIdentifier
执行您的 segue .
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("ToDetail", sender: self)
}
要让搜索栏重新出现,您可以设置一个名为 searchBarShouldBeOpen
的 bool 变量在主视图 Controller 上。在你的SearchAction
函数将这个值设置为true,然后在viewWillAppear
使用带有 searchBarShouldBeOpen
的 if 语句决定是否运行 SearchAction
.另外,考虑制作 SearchAction
一个常规函数并将示例中显示的最后一行以外的所有内容移动到 viewDidLoad
.最后,执行 UISearchBarDelegate
为您的主视图 Controller 覆盖 searchBarCancelButtonClicked
在里面设置 searchBarShouldBeOpen
假的。您的主视图 Controller 看起来像这样:
class ViewController: UIViewController {
//...Your Variables
var searchBarShouldBeOpen: Bool = false
let searchBarKey = "SearchBarText"
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
searchController.searchBar.delegate = self
searchController.hidesNavigationBarDuringPresentation = false
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Search", style: .Plain, target: self, action: #selector(ViewController.showSearchBar))
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if searchBarShouldBeOpen {
navigationController?.presentViewController(searchController, animated: false, completion: nil)
searchBarShouldBeOpen = true
if let previousText = NSUserDefaults.standardUserDefaults().stringForKey(searchBarKey) {
searchController.searchBar.text = previousText
}
}
}
func showSearchBar() {
navigationController?.presentViewController(searchController, animated: true, completion: nil)
searchBarShouldBeOpen = true
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ToDetail" {
let destination = segue.destinationViewController as! DetailViewController
if searchController.searchBar.text != "" {
NSUserDefaults.standardUserDefaults().setValue(searchController.searchBar.text, forKey: searchBarKey)
}
//Pass Info
}
}
//Your functions...
}
extension ViewController: UISearchBarDelegate {
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
searchBarShouldBeOpen = false
}
}
在你的细节 View Controller 中添加:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
编辑:
已更改 viewWillAppear
手动呈现 UISearchBar
没有动画而不是使用 showSearchBar
这样它就不会每次都动画。
添加了对 super.viewWillAppear(animated)
的缺失调用
移动了对 UISearchBar
的解雇到 viewWillAppear
详细 View Controller ,因此搜索不会在转场之前消失。
坚持 UISearchBar
使用 NSUserDefaults
的文本(在 prepareForSegue
中)这样它就可以加载到 viewWillAppear
中将搜索设置为之前的内容。
添加了 searchBarKey
常量用作 UISearchBar
的键文本持久性,因此不会使用“魔术字符串”来设置和访问保存的文本。
注意:您真的应该考虑使用 didSelectRowAtIndexPath
执行转场。
其他选项:如果您想要 UISearchBar
要在主视图 Controller 过渡到详细 View Controller 的同时进行动画处理,您可以使用自定义转场(这将使动画更流畅)。我制作了一个创建此效果的自定义 segue 示例。请注意,您必须将 Interface Builder 中的 View Controller 之间的转接更改为“自定义”类型,并且成为 UIStoryboardSegue
的以下子类。 .
class CustomSegue: UIStoryboardSegue {
override func perform() {
let pushOperation = NSBlockOperation()
pushOperation.addExecutionBlock {
self.sourceViewController.navigationController?.pushViewController(self.destinationViewController, animated: true)
}
pushOperation.addExecutionBlock {
self.sourceViewController.navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
pushOperation.queuePriority = .Normal
pushOperation.qualityOfService = .UserInitiated
let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(pushOperation)
}
}
您可以在以下链接中阅读有关自定义转场中代码的更多信息:
希望对您有所帮助!如果您需要详细说明,请询问! :)
关于ios - 导航栏中的 SearchController 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37979627/
假设,我正在讨论 View Controller 并且我搜索了一些东西。现在我切换了选项卡,现在我又回到了这个讨论 View Controller ,然后导航栏被隐藏了,这是我不想要的。我尝试了所有方
]我在我的应用程序中构建了一个 SearchViewController,它只用于搜索用户。 一切都很好,除了当我进入 View Controller 时,它会在我开始搜索之前显示 firebase
我一直在搜索,只在我的问题上找到这篇文章。 How do I select multiple table rows from filtered results of a Searchbar and S
我已经创建了一个 searchController,因此我试图让它根据 UISearchController 中的文本过滤内容。我创建了一个如下所示的自定义对象。我试过使用 NSPredicate,但
我遇到一个问题,针对目录的 LdapContext.search() 偶尔会永远挂起。我尝试提供一个 SearchControls 对象,我已为其调用了 setTimeLimit(10000),但问题
是否可以创建 UISearchController 以便在许多类中可重用? 在新类中使用最少的代码。 现在我在所有类中都有代码,但我想在所有类中使用最少的代码来调用 searchController:
我有一个 searchController,它可以很好地进行搜索并填充正确的值。但如果 searchingText 和 values 的话,这些代码就会返回值。我需要搜索栏来使搜索生效。例如,当我输入
我正在尝试创建一个搜索栏,当您单击“搜索”(也在导航栏中)时,它会出现在导航栏的顶部。单击搜索结果会将您带到详细信息页面,搜索栏将在该页面消失。当您单击返回主页 VC 时,搜索栏会重新出现。以为这很简
@IBAction func MapSearchController(_ sender: UIBarButtonItem) { let searchTable = storyboard!.in
我有两个 View Controller ControllerA 和 ControllerB。两者都没有 NavigationBar,因为我在两个 Controller 中都隐藏了 navigatio
我在带有 TableView 的 viewController 中实现了一个搜索 Controller ,还有一个搜索 Controller ,搜索栏在搜索按钮被录音时显示,搜索按钮是一个 UIBar
您好,我有一个 searchController,它会在单击新 View 显示之前出现的搜索项之一时消失。我希望搜索 Controller 保持事件状态,这样当用户返回 View 时,他们仍然可以看到
我有像这样的字典格式的数据: var data: [[String:AnyObject]] = [ [ "id": "1", "title": "A Title", "De
与已发布的问题相同(没有答案有效..),我的表格是固定宽度的,在 iOS 10.x 中,搜索栏(位于 tableviewheader 中)在键入时保持相同的大小。然而在 iOS 11 中,它会跳到屏幕
我有一个在导航 Controller 中嵌入标签栏 Controller 的应用程序。该应用程序有 2 个选项卡,第一个(搜索)有一个使用 UISearchController 实现的搜索栏。如果我在
当我正在搜索然后切换 UItab 时,不会调用 ViewWillDisappear。知道为什么当我过滤结果显示和切换选项卡时 ViewWillDisappear 没有被调用吗? func update
我的应用程序中有一个奇怪的视觉错误,它仅适用于从 Xcode 11 版本运行的 iOS 13。我有一个嵌入在导航 Controller 中的表格 View ,默认色调颜色设置为我的应用程序的主要橙色。
我在导航 Controller 中有一个表 View ,以便我可以将详细 View Controller 推送到堆栈上。它工作正常,直到我向导航项添加搜索 Controller ,如下所示: sear
我正在尝试实现一个搜索 Controller 。从数组显示一切正常。现在我试图显示 MapKit 的结果,但在 collectionView 中看不到任何内容。我正在以编程方式完成所有操作,因此这可能
我使用 searchController 在搜索所有用户的列表时获得良好的用户体验。但是,我希望用户在进入 searchController 时看到未过滤的用户列表。到目前为止,正如标题中所写,只有在
我是一名优秀的程序员,十分优秀!