0

テーブル ビューで検索機能を使用しようとしています。データは想定どおりに変更されますが、検索後に生成されたセルにヒットした瞬間、次のビューに移動しません。selectedIndex 変数のこのコードでクラッシュします。

if self.tableView == self.searchDisplayController!.searchResultsTableView {
        var selectedIndex = self.tableView.indexPathForSelectedRow()!.row
        selectedTimeSlot = filteredTimeSlots[selectedIndex]
    } else {
        var selectedIndex = self.tableView.indexPathForSelectedRow()!.row
        selectedTimeSlot = timeSlots[selectedIndex]
    }

これは私のコード全体です

import UIKit
import Alamofire

class ClockEditTableViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate {

    // Contains all time slots
    var timeSlots: [TimeSlot] = [TimeSlot]()

    // Contains the search results
    var filteredTimeSlots: [TimeSlot] = [TimeSlot]()

    override func viewDidLoad() {

//        timeSlots = DataHelper.getTimeSlots()
        Alamofire.request(.GET, "http://wouterhabets.com/acts.json")
            .response { (request, response, data, error) in
                if error == nil {
                    self.timeSlots = DataHelper.getTimeSlots(data as NSData)
                    self.tableView.reloadData()
                } else {
                    self.timeSlots = DataHelper.getTimeSlots()
                    self.tableView.reloadData()
                }
        }

        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var actDetailViewController: ActDetailsViewController = segue.destinationViewController as ActDetailsViewController
        var selectedTimeSlot: TimeSlot

        if self.tableView == self.searchDisplayController!.searchResultsTableView {
            var selectedIndex = self.tableView.indexPathForSelectedRow()!.row
            selectedTimeSlot = filteredTimeSlots[selectedIndex]
        } else {
            var selectedIndex = self.tableView.indexPathForSelectedRow()!.row
            selectedTimeSlot = timeSlots[selectedIndex]
        }

        actDetailViewController.timeSlot = selectedTimeSlot
    }

    // Return the amount of cells to display
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        var count: Int

        // Check if the user is searching
        if tableView == self.searchDisplayController!.searchResultsTableView {
            count = filteredTimeSlots.count
        } else {
            count = timeSlots.count
        }

        return count
    }

    // Fill cells with data
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier("actCell", forIndexPath: indexPath) as UITableViewCell

        var timeSlot: TimeSlot

        // Check if the user is searching
        if tableView == self.searchDisplayController!.searchResultsTableView {
            timeSlot = filteredTimeSlots[indexPath.row]
        } else {
            timeSlot = timeSlots[indexPath.row]
        }

        cell.textLabel?.text = timeSlot.act?.title

        return cell
    }

    func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
        self.filterContentForSearchText(searchString)
        return true
    }

    func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchScope searchOption: Int) -> Bool {
        self.filterContentForSearchText(self.searchDisplayController!.searchBar.text)
        return true
    }

    func filterContentForSearchText(searchText: String) {
        self.filteredTimeSlots = self.timeSlots.filter({( timeSlot: TimeSlot) -> Bool in

            // Optional scope search code
            // let categoryMatch = (scope == "All") || (band.category == scope)
            let searchText = searchText.lowercaseString

            let stringMatch = timeSlot.act?.title?.lowercaseString.rangeOfString(searchText)
            return (stringMatch != nil) // && categoryMatch
        })
    }

}

誰かが私が間違っていることと、これを修正するために何をすべきかの手がかりを持っていますか?

4

1 に答える 1