当我删除它们时,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 会复活已删除的对象?

当我尝试从单链表中删除节点时,为啥我的 C 程序会崩溃

当两个div元素显示为内联块时如何删除它们之间的空白[重复]

解析PDF删除月份

如何修复 Recyclerview 项目删除显示错误