Поток 1 exc_bad_instruction (код =exc_i386_invop, субкод =0x0) с использованием поиска

Я пытаюсь использовать функцию поиска в табличном представлении. данные изменяются так, как и предполагалось, но в тот момент, когда я попаду в ячейку, сгенерированную после поиска, я не перейду к следующему представлению. Сбой этого фрагмента кода в selectedIndex var.

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
        })
    }

}

Кто-нибудь знает, что я делаю неправильно, и что я должен сделать, чтобы это исправить

1 ответ

self.tableView это основной вид таблицы, так

self.tableView == self.searchDisplayController!.searchResultsTableView

никогда не будет правдой

Вы должны проверить, является ли активный tableView основным столом или поиском tableView.

if self.searchDisplayController.active {
    // get the index path from search table ... 
} else {
    // get the index path from main table ...
}

Здесь тоже ответили. searchDisplayController, UITableView, Core Data и Swift

Кроме того, будьте осторожны при использовании восклицательного знака в

self.tableView.indexPathForSelectedRow()!

так как это может вернуть ноль, а если он вернет ноль, вы получите ошибку во время выполнения

Другие вопросы по тегам