当我删除它们时,UISearchController 不会删除结果
Posted
技术标签:
【中文标题】当我删除它们时,UISearchController 不会删除结果【英文标题】:UISearchController does not delete the result when I delete them 【发布时间】:2016-02-26 08:00:47 【问题描述】:我在我的应用中实现了 UISearchController 来搜索要关注和取消关注的用户。我使用 swift 和 Parse 作为后端。问题是,每当我想输入一些内容然后删除它时,它会保留检索到的结果并且不会删除它们。当没有结果时,表格视图显示“没有结果”与检索结果,因为没有删除! 我不知道是什么问题。有什么帮助吗?
这是代码,
UISearchController 委托和方法,
// To search
var userSearchController: UISearchController!
var resultsController = UITableViewController()
var searchActive: Bool = false
// To follow and unfollow users
var userIds = [""]
var isFollowing = ["":false]
// MARK: - Lifecycle
override func viewDidLoad()
super.viewDidLoad()
// tableview delegate and datasource
self.resultsController.tableView.dataSource = self
self.resultsController.tableView.delegate = self
self.resultsController.loadViewIfNeeded()
configureSearchController()
func configureSearchController()
self.userSearchController = UISearchController(searchResultsController: nil)
// Set the search controller to the header of the table
self.tableView.tableHeaderView = self.userSearchController.searchBar
// This is used for dynamic search results updating while the user types
// Requires UISearchResultsUpdating delegate
self.userSearchController.searchResultsUpdater = self
self.userSearchController.dimsBackgroundDuringPresentation = false
self.definesPresentationContext = true
// Configure the search controller's search bar
self.userSearchController.searchBar.placeholder = "Search for a parent"
self.userSearchController.searchBar.sizeToFit()
self.userSearchController.searchBar.delegate = self
// MARK: - Search Bar Delegate Methods
func searchBarSearchButtonClicked(searchBar: UISearchBar)
let searchString: String = searchBar.text!.lowercaseString
if searchActive == false
searchActive = true
// Force search if user pushes button
if (searchString != "")
loadSearchUsers(searchString)
self.resultsController.tableView.reloadData()
func searchBarTextDidBeginEditing(searchBar: UISearchBar)
searchActive = true
func searchBarTextDidEndEditing(searchBar: UISearchBar)
searchActive = false
func searchBar(searchBar: UISearchBar, textDidChange searchText: String)
if (searchBar.text == "")
searchActive = false
else
searchActive = true
let searchString: String = searchBar.text!.lowercaseString
if (searchString != "")
loadSearchUsers(searchString)
func searchBarCancelButtonClicked(searchBar: UISearchBar)
searchActive = false
searchBar.text = ""
self.searchUsers.removeAll(keepCapacity: false)
self.resultsController.tableView.reloadData()
func updateSearchResultsForSearchController(searchController: UISearchController)
if let searchString: String = searchController.searchBar.text!.lowercaseString
if (searchString != "" && !self.searchActive)
loadSearchUsers(searchString)
这是 NumberOfSectionsInTableView
override func numberOfSectionsInTableView(tableView: UITableView) -> Int
var numOfSection: NSInteger = 0
if userIds.count > 0
//self.resultsController.tableView.reloadData()
self.tableView.backgroundView = nil
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine
numOfSection = 1
else
let noDataLabel: UILabel = UILabel(frame: CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height))
noDataLabel.text = "No result."
noDataLabel.textColor = UIColor(red: 22.0/255.0, green: 106.0/255.0, blue: 180.0/255.0, alpha: 1.0)
noDataLabel.textAlignment = NSTextAlignment.Center
self.tableView.backgroundView = noDataLabel
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
return numOfSection
如果您需要更多信息,请告诉我。非常感谢。
【问题讨论】:
@Russell 嗨,Russell!我从这里得到了你的 UISearchController,***.com/questions/32356676/… 并为我工作,但我有这个问题,你能帮帮我吗? 【参考方案1】:表格数据不会因为您对搜索文本进行了更改而被删除。您必须先清除数据集,然后将搜索结果设置为数据集,然后重新加载,您已经在 searchBarCancelButtonClicked
方法中这样做了。
self.searchUsers.removeAll()
self.searchUsers.appendContentsOf(results)
self.resultsController.tableView.reloadData()
【讨论】:
这里的结果是什么意思? self.searchUsers.appendContentsOf(results) 你介意我给你发一个演示吗?这个问题让我很沮丧! @TejasArdeshna 你认为我只能使用 UISearchController 来搜索我的应用程序中已有的数据吗?我是否需要我的应用程序中的所有数据来过滤它们? 'results' 可以来自任何来源,如果你有一些事情要过滤,你认为你先做它并确定你需要显示的项目列表,然后你可以删除数据集项目并添加这些过滤结果。然后只需简单的 reloadData 就会显示它们。 您介意我将代码发送给您检查吗?我解决了一个问题,另一个刚刚出来!我真的不知道是什么问题。每当我输入空格,"" 时,它都会返回存储在 Parse 中的所有数据。此外,当我尝试删除我刚刚输入的内容时,除了按钮之外,其他所有内容都会消失,我的单元格上有名称、图像和按钮。如果打扰到你,我很抱歉。你能帮帮我吗?【参考方案2】:也许你忘记了 table.reloadData()。试试这段代码
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var table: UITableView!
var dataArray = [1 : "first" ,2 : "second",3 :"third",]
var filteredArray = [String]()
var gotResult = false
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
self.view.endEditing(true);
self.searchBar.endEditing(true)
gotResult = false
table.reloadData()
func searchBarTextDidBeginEditing(searchBar: UISearchBar)
gotResult = true
table.reloadData()
func searchBarSearchButtonClicked(searchBar: UISearchBar)
if !gotResult
gotResult = true
table.reloadData()
searchBar.resignFirstResponder()
func searchBar(searchBar: UISearchBar, textDidChange searchedText: String)
filteredArray = dataArray.values.filter( (Items) -> Bool in
let currentItem: NSString = Items
return (currentItem.rangeOfString(searchedText, options: NSStringCompareOptions.CaseInsensitiveSearch).location) != NSNotFound
)
self.table.reloadData()
//Codes for table
func numberOfSectionsInTableView(tableView: UITableView) -> Int
return 1
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if gotResult
return filteredArray.count
else
return dataArray.count
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = UITableViewCell();
let value = Array(dataArray.values)[indexPath.row]
if gotResult
cell.textLabel?.text = filteredArray[indexPath.row]
else
cell.textLabel?.text = value
return cell
【讨论】:
感谢您的回复!!但我有疑问。你认为我只能使用 UISearchController 在我的应用程序中搜索吗? 我的意思是,数据不在我的 tableviewcontroller 中。我想直接从 Parse 中搜索。我可以使用 UISearchController 来做到这一点吗?或者我应该在我的 tableviewcontroller 中有数据? 抱歉,我不认为数据必须在您的 tableviewcontroller 中以上是关于当我删除它们时,UISearchController 不会删除结果的主要内容,如果未能解决你的问题,请参考以下文章
当我删除相关对象时,为啥 Core Data 会复活已删除的对象?