如何在新视图中显示 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 的搜索栏