UISearchController未被调用的行数

时间:2015-12-10 15:54:02

标签: ios swift uisearchbar xcode7 uisearchcontroller

我试图发送搜索电影的请求,但是当我点击搜索栏来写文本时,我在cellforrow中遇到了崩溃,并且它没有在请求中调用numberofrows。到目前为止,这是我的代码:

class InTheaters: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate {

@IBOutlet weak var poster: UIImageView!
@IBOutlet weak var movieTitle: UILabel!
@IBOutlet weak var date: UILabel!
@IBOutlet weak var duration: UILabel!
@IBOutlet weak var rating: UILabel!
@IBOutlet var theatersTable: UITableView!
@IBOutlet weak var starsView: CosmosView!

var results = [Movie]()
var searchResults = [Search]()
var resultSearchController: UISearchController!
private let key = "qtqep7qydngcc7grk4r4hyd9"

override func viewDidLoad() {
    super.viewDidLoad()

    self.resultSearchController = UISearchController(searchResultsController: nil)
    self.resultSearchController.searchResultsUpdater = self
    self.resultSearchController.dimsBackgroundDuringPresentation = false
    self.resultSearchController.searchBar.sizeToFit()
    self.resultSearchController.searchBar.placeholder = "Search for movies"

    self.theatersTable.tableHeaderView = self.resultSearchController.searchBar

    self.theatersTable.reloadData()

    getMovieInfo()
    customIndicator()
    infiniteScroll()
}

func customIndicator() {

    self.theatersTable.infiniteScrollIndicatorView = CustomInfiniteIndicator(frame: CGRectMake(0, 0, 24, 24))

    self.theatersTable.infiniteScrollIndicatorMargin = 40
}

func infiniteScroll() {

    self.theatersTable.infiniteScrollIndicatorStyle = .White

    self.theatersTable.addInfiniteScrollWithHandler { (scrollView) -> Void in

        self.getMovieInfo()
    }
}

func getMovieInfo() {

    Alamofire.request(.GET, "http://api.rottentomatoes.com/api/public/v1.0/lists/movies/in_theaters.json?page_limit=10&page=1&country=us&apikey=\(key)").responseJSON() {
        (responseData) -> Void in

        if let swiftyResponse = responseData.result.value {

            let movies = Movies(JSONDecoder(swiftyResponse))

            for movie in movies.allMovies {

                self.results.append(movie)
            }
        }
        self.theatersTable.reloadData()
        self.theatersTable.finishInfiniteScroll()
    }
}

func updateSearchResultsForSearchController(searchController: UISearchController) {

    self.searchResults.removeAll(keepCapacity: false)

    if (searchController.searchBar.text?.characters.count > 0) {

        Alamofire.request(.GET, "http://api.rottentomatoes.com/api/public/v1.0/movies.json?q=N&page_limit=10&page=1&apikey=\(key)").responseJSON() {
            (responseData) -> Void in

            print(responseData)

            if let swiftyResponse = responseData.result.value {

                let searches = Searches(JSONDecoder(swiftyResponse))

                for search in searches.allSearches {

                    self.searchResults.append(search)
                }
            }
            self.theatersTable.reloadData()
            self.theatersTable.finishInfiniteScroll()
        }
    }
}

// MARK: - Table view data source

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

    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if (self.resultSearchController.active) {

        return self.searchResults.count
    } else {

        return self.results.count
    }
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

    let titleLabel = cell.viewWithTag(1) as! UILabel
    let yearLabel = cell.viewWithTag(2) as! UILabel
    let durationLabel = cell.viewWithTag(3) as! UILabel
    let posterImage = cell.viewWithTag(5) as! UIImageView
    let starsTag = cell.viewWithTag(6) as! CosmosView

    if (self.resultSearchController.active) {

        titleLabel.text = searchResults[indexPath.row].titleMovie
        yearLabel.text = searchResults[indexPath.row].yearMovie
        durationLabel.text = searchResults[indexPath.row].durationMovie?.description
        posterImage.sd_setImageWithURL(NSURL(string: searchResults[indexPath.row].posterMovie!))
        starsTag.rating = searchResults[indexPath.row].ratingMovie!
        starsTag.settings.updateOnTouch = false
    } else {

        titleLabel.text = results[indexPath.row].titleMovie
        yearLabel.text = results[indexPath.row].yearMovie
        durationLabel.text = results[indexPath.row].durationMovie?.description
        posterImage.sd_setImageWithURL(NSURL(string: results[indexPath.row].posterMovie!))
        starsTag.rating = results[indexPath.row].ratingMovie!
        starsTag.settings.updateOnTouch = false
    }

    return cell
}

我也有一些结构信息请求告诉我你是否也需要这些东西。

1 个答案:

答案 0 :(得分:0)

在请求之前找到答案应该有reloadData。

func updateSearchResultsForSearchController(searchController: UISearchController) {

    self.searchResults.removeAll(keepCapacity: false)

    self.theatersTable.reloadData()//should have added this before the request

    if (searchController.searchBar.text?.characters.count > 0) {

        Alamofire.request(.GET, "http://api.rottentomatoes.com/api/public/v1.0/movies.json?q=\(searchController.searchBar.text!)&page_limit=10&page=1&apikey=\(key)").responseJSON() {
            (responseData) -> Void in

            if let swiftyResponse = responseData.result.value {

                let searches = Searches(JSONDecoder(swiftyResponse))

                for search in searches.allSearches {

                    self.searchResults.append(search)
                }
            }
            self.theatersTable.reloadData()
            self.theatersTable.finishInfiniteScroll()
        }
    }
}