当前位置: 首页 > 面试题库 >

以编程方式显示UISearchController的搜索栏

宋伯寅
2023-03-14
问题内容

注意1: 此问题与在更新的表视图之外添加UISearchController的搜索栏有关,而不是作为表视图的标题。

注意2:
一些反复试验使我找到了解决方案。

我是iOS开发的新手,正在努力使用UISearchController类。我有一个视图控制器,在我的视图控制器视图中,我计划在表格视图上方有一个搜索栏。我希望搜索栏链接到UISearchController。由于接口生成器没有UISearchController附带,因此我以编程方式添加了控制器。实例化UISearchController之后,我尝试以编程方式将搜索控制器的搜索栏添加到我的视图中,但没有成功。我曾尝试设置搜索栏的框架并为其设置自动布局约束,但是这两种方法都不适合我(即,当我运行该应用程序时,什么都没有出现)。这是我尝试过的最新代码:

    let searchController = UISearchController(searchResultsController: nil)

    // Set the search bar's frame
    searchController.searchBar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 50)

    // Constraint to pin the search bar to the top of the view
    let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
    searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)

    self.view.addSubview(searchController.searchBar)

    self.view.addConstraint(topConstraint)

任何帮助将不胜感激!谢谢!

编辑:
仅使用一种设置搜索栏的框架,或者您给它设置自动布局约束(相对于我最初尝试的组合方式)一开始似乎可以工作,但是点击搜索栏后,您将遇到所指出的问题由德怀特。我将这些情况的代码保留下来,以防与您目前拥有的代码进行比较,但是对于有效的解决方案,请参见下面的答案。

使用自动布局约束:

    let searchController = UISearchController(searchResultsController: nil)

    let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: (statusBarHeight + navigationBarHeight!))
    let leftConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0)
    let rightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0)
    let heightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 44)
    searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)

    searchController.searchBar.addConstraint(heightConstraint)

    self.view.addSubview(searchController.searchBar)

    self.view.addConstraints([topConstraint, leftConstraint, rightConstraint])

我已经将topConstraint常量设置为状态栏的高度加上导航栏的高度,因为我的视图控制器嵌入在导航控制器中。

调整框架:

    let searchController = UISearchController(searchResultsController: nil)

    searchController.searchBar.frame = CGRect(x: 0, y: (statusBarHeight + navigationBarHeight!), width: self.view.frame.size.width, height: 44)

    self.view.addSubview(searchController.searchBar)

问题答案:

经过一番反复尝试后,我得到了以下可行的解决方案:

  1. 打开Main.storyboard,然后将高度为44(UISearchBar的默认高度)的UIView和UITableView添加到视图控制器。设置自动布局约束,以便将UIView固定在两侧和顶部布局指南上(使用顶部布局指南可确保无论您的视图控制器是否嵌入导航控制器中都可以使用),并将表格视图固定在两侧是底部布局指南,其顶部固定在UIView的底部。
  2. 在ViewController.swift中将UIView和UITableView作为IBOutlets连接。在我的项目中,我将它们称为topView和tableView。
  3. 在ViewController.swift的顶部声明一个搜索控制器: var searchController: UISearchController!
  4. 然后,在viewDidLoad()中,您将需要:

    // Initialize and set up the search controller
    

    self.searchController = UISearchController(searchResultsController: nil)
    self.searchController.searchResultsUpdater = self
    self.searchController.dimsBackgroundDuringPresentation = false // Optional
    self.searchController.searchBar.delegate = self

    // Add the search bar as a subview of the UIView you added above the table view
    self.topView.addSubview(self.searchController.searchBar)
    // Call sizeToFit() on the search bar so it fits nicely in the UIView
    self.searchController.searchBar.sizeToFit()
    // For some reason, the search bar will extend outside the view to the left after calling sizeToFit. This next line corrects this.
    self.searchController.searchBar.frame.size.width = self.view.frame.size.width

应该是这样!当然,您需要将视图控制器设置为UITableViewDatasource,UITableViewDelegate,UISearchBarDelegate,UISearchControllerDelegate和UISearchResultsUpdating,并且还要照顾所有必需的委托方法,但是就搜索栏而言,这对我来说是有用的。如果您有任何问题,请发表评论。



 类似资料:
  • 问题内容: 是否有人知道是否以及如何以编程方式搜索Google-尤其是如果有Java API的话? 问题答案: 这是一个使用Jsoup作为HTML解析器的启动示例:

  • 问题内容: 我有这样的看法 和涟漪.xml作为 一切正常。当我触摸视图时,它会产生波纹效果。我正在寻找的是从代码中反复在视图上启动波纹动画。将其显示为不确定的进度。因此,海浪不断荡漾。 就像是 这该怎么做? 问题答案: 响应压力和聚焦状态,前者提供您要查找的波纹动画。您可以使用来在主机视图上切换按下状态。 请记住,用户触摸切换按钮也会切换按下状态,因此您可能想要删除或重新发布可运行项。 如果需要,

  • 问题内容: 首先,我已经看到了该线程。我尝试了那里给出的可接受的方法。 我的应用程序中有两个屏幕。 第一个有2个EditText,一个是用户名,另一个是密码 第二个有一个ListView和一个EditText-过滤listView 在我的第一个屏幕中,我希望用户名EditText专注于启动,并且Keyboard应该可见。这是我的实现(通过删除不必要的/不相关的代码进行简化)。 app_login.

  • 我想在用户按下按钮时启动Google Now语音搜索。然而,我在文档中找不到开始搜索的意图。 有人知道如何启动Google Now语音搜索活动吗?

  • 我的目标是根据用户是否登录显示不同的第一页。登录检查使用同步Ajax调用进行,其结果决定是显示登录对话框还是显示第一个用户页面。 执行此操作的正常方法是设置,然后以编程方式初始化,如本问题的答案中所述。由于某种原因,这不起作用,而是每次都会加载另一个页面。 我决定放弃这种方式,尝试不同的方案。我现在使用一个占位符,空的启动页面,只要登录检查需要,就应该显示该页面。登录检查后,它应该会自动更改。这是

  • 问题内容: 在Android中,每个子类都有一个方法,可让您修改对象的可见性 设置可见性有3个选项: 可见:在布局内渲染可见 看不见:隐藏,但留下的间隙等于可见时将占据的间隙 消失:隐藏,并将其完全从布局中删除。这是因为如果它和人 Flutter中的小部件是否具有与上述等同的功能? 快速参考:https : //developer.android.com/reference/android/vie