【问题标题】:UISearchBar not updatingUISearchBar 没有更新
【发布时间】:2015-11-30 18:41:10
【问题描述】:

我有一个UIViewController,我在其中添加了UITableViewController,我正在以编程方式添加搜索栏。我可以在控制台上搜索后打印结果,但是当我点击搜索栏时,自定义表格单元格仍会被填充,并且搜索根本不会更新它们。

我在override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 中有打印语句来检查搜索控制器是否处于活动状态并且它从不打印该语句。

import UIKit
import Parse

class MasterViewController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate {

@IBOutlet var mTableView: UITableView!
var detailViewController: DetailViewController? = nil
var objects = [AnyObject]()
var resultSearchController = UISearchController()
var filteredData : NSMutableArray = []
var sectionInTable : NSMutableArray = ["Grand Haven 9", "Holland 7"]
var movieTitle : NSMutableArray = ["The Hunger Game 2","Creed"]
var movieTimeSection1 : NSMutableArray = ["11:00am, 11:40, 12:10pm, 1:25, 2:30, 6:05, 6:55, 7:30, 9:05", "11:10am, 11:50, 12:20pm, 2:25, 3:30, 6:05, 6:55, 8:30, 10:05"]
var movieTimeSection2 = ["Title": "Martian", "Theatre": "Holland 7", "Time": "11:00am, 11:40, 12:10pm, 1:25, 2:30, 6:05, 6:55, 7:30, 9:05"]


var onlineMovieTitle : NSMutableArray = []

var movieSection1 : NSMutableArray = []
var movieSection2 : NSMutableArray = []

override func viewDidLoad() {
    super.viewDidLoad()

    print(movieSection1)
    print(movieSection2)

    self.tableView.separatorColor = UIColor.cloudsColor()
    self.tableView.backgroundColor = UIColor.cloudsColor()

    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false
        controller.searchBar.delegate = self
        controller.searchBar.sizeToFit()
        controller.preferredStatusBarStyle() == UIStatusBarStyle.LightContent
        controller.hidesNavigationBarDuringPresentation = false
        self.mTableView.tableHeaderView = controller.searchBar

        return controller
    })()
    //self.resultSearchController.searchBar.endEditing(true)

}
func updateSearchResultsForSearchController(searchController: UISearchController){
    filteredData.removeAllObjects()

    let searchPredicate = NSPredicate(format: "Title CONTAINS %@", searchController.searchBar.text!.uppercaseString)
    let array = (movieSection1 as NSArray).filteredArrayUsingPredicate(searchPredicate)
    let array2 = (movieSection2 as NSArray).filteredArrayUsingPredicate(searchPredicate)
    //let array2 = (movieTimeSection1 as NSArray).filteredArrayUsingPredicate(searchPredicate)
    filteredData.addObjectsFromArray(array)
    filteredData.addObjectsFromArray(array2)

    print(filteredData)
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.resultSearchController.searchBar.hidden = false
}

// MARK: - Segues

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow {

        }

    }
}

// MARK: - Table View

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 2
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    var count : Int = 0
    if (self.resultSearchController.active) {
        return 2
    }
    else {
        if section == 0 {
            count = movieSection1.count
        } else if section == 1 {
            count = movieSection2.count
        }
    }
    return count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell : MainTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! MainTableViewCell

    //Fancy Cells
    var corners : UIRectCorner = UIRectCorner.AllCorners
        if (tableView.numberOfRowsInSection(indexPath.section) == 1) {
            corners = UIRectCorner.AllCorners
        } else if (indexPath.row == 0) {
            corners = UIRectCorner.TopLeft.union(UIRectCorner.TopRight)
        } else if (indexPath.row == tableView.numberOfRowsInSection(indexPath.section) - 1) {
            corners = UIRectCorner.BottomLeft.union(UIRectCorner.BottomRight)
        }
    cell.configureFlatCellWithColor(UIColor.greenSeaColor(), selectedColor: UIColor.cloudsColor(), roundingCorners: corners)

    //Fancy Buttons
    cell.cornerRadius = 7
    if indexPath.row == 0 {
        cell.trailorButton.addTarget(self, action: "openHunger:", forControlEvents: UIControlEvents.TouchUpInside)
    }else if indexPath.row == 1{
        cell.trailorButton.addTarget(self, action: "openCreed:", forControlEvents: UIControlEvents.TouchUpInside)
    }
    cell.trailorButton.layer.cornerRadius = 5
    cell.trailorButton.tintColor = UIColor.whiteColor()

    let movieNameStr = movieTitle[indexPath.row] as! String
    cell.movieImage.image = UIImage(named: movieNameStr)

    //Cell Data Insertion

    if (self.resultSearchController.active){
        print("search ---------------")
        cell.movieName.text = filteredData[indexPath.row].valueForKey("Title") as? String
        cell.movieDetail.text = filteredData[indexPath.row].valueForKey("Time") as? String
        return cell
    }else {
        print("cell")
        if indexPath.section == 0 {
            cell.movieName.text = movieSection1[indexPath.row].valueForKey("Title") as? String
            cell.movieDetail.text = movieSection1[indexPath.row].valueForKey("Time") as? String
        } else if indexPath.section == 1 {
            cell.movieName.text = movieSection2[indexPath.row].valueForKey("Title") as? String
            cell.movieDetail.text = movieSection2[indexPath.row].valueForKey("Time") as? String
        }
        return cell
    }



    //return cell
}

@IBAction func openHunger(sender: AnyObject) {
    UIApplication.sharedApplication().openURL(NSURL(string: "https://youtu.be/n-7K_OjsDCQ")!)
}
@IBAction func openCreed(sender: AnyObject) {
    UIApplication.sharedApplication().openURL(NSURL(string: "https://youtu.be/fCBzWLVQgk8")!)
}
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return self.sectionInTable[section] as? String
}

}

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

【问题讨论】:

  • Dereck .. 在“updateSearchResultsForSearchController”中折腾其中之一 dispatch_async(dispatch_get_main_queue(), ^{ [self.contentView.tableView reloadData]; }); .. 这是objective-c,所以只需将它翻译成Swift。但我认为您可能只需要重新加载 tableView 即可查看结果,但我到底知道,我不使用 UISearchControllers 或其他任何名称,我使用 UITextFields 并手动完成所有操作。
  • 天啊,我不敢相信我删除了那行,谢谢它是问题所在。我不敢相信我看了很多遍之后错过了它。您想将此作为答案发布,以便我关闭它吗?
  • 没问题,希望这是唯一的问题

标签: ios swift uitableview uiviewcontroller uisearchbar


【解决方案1】:

我错过了,感谢 Larcerax,通过添加 mTableView.reloadData() 解决了问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2015-08-10
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多