如何在新视图中显示 UISearchController 结果而不显示 tableView 的背景?

Posted

技术标签:

【中文标题】如何在新视图中显示 UISearchController 结果而不显示 tableView 的背景?【英文标题】:How do I display UISearchController results in a new view and not show the background of the tableView? 【发布时间】:2015-12-05 22:17:03 【问题描述】:

快速提问,我正在使用 UISearchController,它运行良好。

但我想知道当我选择搜索栏时是否可以显示新视图?

因为我在搜索时不想看到我的 tableView/background。

【问题讨论】:

您希望在触摸搜索栏时显示一个特殊的视图,但没有输入任何内容,对吗? 是的,没什么特别的,只是一个普通的视图! 听起来你想要像github.com/nxtbgthng/UITableView-NXEmptyView 这样的东西 - 将它应用到你的搜索表视图,你应该很高兴。让我知道这是否是解决方案,我可以将其发布为答案。 在不安装的情况下这样做不是更正常吗? 如果你想走香草路线,请参阅***.com/a/17436782/1849664。我通常选择 NXEmptyView 选项只是因为它更干净。 【参考方案1】:

您指的是UISearchController 的表示上下文

Here is a linkdefinesPresentationContext 上的 Apple 文档以及我们关心的相关信息

此属性控制视图中的现有视图控制器 控制器层次结构实际上已被新内容覆盖

如果您还在使用之前的this example UISearchController,那么您已经差不多完成了,只需查看viewDidLoad() 内的以下代码行:

self.definesPresentationContext = true

默认值为false。由于它设置为 true,我们告诉UITableViewController,当视图控制器或其后代之一呈现视图控制器时,它将被覆盖。在我们的例子中,我们用 UISearchController 覆盖了 UITableViewController。

为了解决您的问题,隐藏 tableView/background 就像在搜索栏处于活动状态时清除或切换表格的数据源一样简单。这是在以下代码中处理的。

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    if (self.userSearchController.active) 
        return self.searchUsers.count
     else 
        // return normal data source count
    


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    var cell = tableView.dequeueReusableCellWithIdentifier("userCell") as! UserCell
    if (self.userSearchController.active && self.searchUsers.count > indexPath.row) 
        // bind data to the search data source
     else 
        // bind data to the normal data source
    
    return cell

当搜索栏被关闭时,我们要重新加载正常的数据源,方法如下:

func searchBarCancelButtonClicked(searchBar: UISearchBar) 

    // Clear any search criteria
    searchBar.text = ""

    // Force reload of table data from normal data source

这是 UISearchControllers 上的 link to a great article,还简要概述了它们的内部工作原理和视图层次结构。

对于未来关于 SO 的帖子,您应该始终尝试包含相关的代码示例,以便人们能够提供最好的反馈:)

编辑

我想我误解了你的问题,但以上内容仍然与答案相关。要在搜索结果为空或未输入任何内容时显示特殊视图,请执行以下操作:

1) 在情节提要中添加一个新的UIView 作为TableView 的子级UITableViewController 以及所需的标签/图像。这将在您可能拥有的任何原型单元旁边。

2) 在您的UITableViewController 中创建并连接插座

@IBOutlet var emptyView: UIView!
@IBOutlet weak var emptyViewLabel: UILabel!

3) 最初在viewDidLoad()中隐藏视图

self.emptyView?.hidden = true

4) 创建一个帮助函数来更新视图

func updateEmptyView() 
    if (self.userSearchController.active) 
        self.emptyViewLabel.text = "Empty search data source text"
        self.emptyView?.hidden = (self.searchUsers.count > 0)
     else 
        // Keep the emptyView hidden or update it to use along with the normal data source
        //self.emptyViewLabel.text = "Empty normal data source text"
        //self.emptyView?.hidden = (self.normalDataSource.count > 0)
    

5) 查询完毕后拨打updateEmptyView()

func loadSearchUsers(searchString: String) 
    var query = PFUser.query()

    // Filter by search string
    query.whereKey("username", containsString: searchString)

    self.searchActive = true
    query.findObjectsInBackgroundWithBlock  (objects: [AnyObject]?, error: NSError?) -> Void in

        if (error == nil) 
            self.searchUsers.removeAll(keepCapacity: false)
            self.searchUsers += objects as! [PFUser]
            self.tableView.reloadData()
            self.updateEmptyView()
         else 
            // Log details of the failure
            println("search query error: \(error) \(error!.userInfo!)")
        
        self.searchActive = false
    

希望有帮助!

【讨论】:

感谢您的回答!我已经在上面添加了我的代码,我想我已经完成了你所说的一切,这就是我已经拥有的。但是,例如,我在我的表格视图中添加了一个背景(或者如果我有多个图像),它也会在我搜索时显示它。我只是在看这篇帖子***.com/questions/31776376/…,他将结果与情节提要中的新视图联系起来。我这样做了,并且出现了一个新视图,但我只是想弄清楚如何在新视图中而不是旧视图中显示结果! 刚刚添加了一个 massive 编辑,我认为它回答了你真正的问题哈哈。看看,如果有帮助,请告诉我:) 我会很高兴的 :) 当你说创建一个助手时,你的意思是一个 swift 文件吗? 不,它只是你的 UITableViewController 类中的另一个函数 这是一个单独的函数。 listingSearchController 只是一个错字,应该是 userSearchController

以上是关于如何在新视图中显示 UISearchController 结果而不显示 tableView 的背景?的主要内容,如果未能解决你的问题,请参考以下文章

在新视图中立即显示键盘[重复]

通过 REST API 检索结果并将其显示在新活动的列表视图中(列表视图出现小问题)

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

滑动以在新的viewcontroller中显示第二张图片

在列表表视图中放置 3 个复选标记,按下按钮,在新表视图中显示 3 列

SwiftUI 如何在新视图中链接 ForEach 索引和照片索引?