@korolevsky_s
iOS Developer

Почему не работает переход после клика по cell в результате поиска по таблице?

Настроил поиск по tableView. все работает, таблица сортируется по результату ввода, но при клике на ячейку приложение падает (fatal error: unexpectedly found nil while unwrapping an Optional value). Без searchBar все кликается, все работает. Как быть? Есть предположение, что виновен imageView, т.к. сортирую таблицу я только по String массиву имен.
func updateSearchResultsForSearchController(searchController: UISearchController) {
        self.filteredRal = self.ralNames.filter { (ral: String) -> Bool in
            if ral.lowercaseString.containsString(self.searchController.searchBar.text!.lowercaseString) {
                return true
            } else {
                return false
            }
        }
        
        self.resultsController.tableView.reloadData()
    }

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableView == self.tableView {
            return self.ralNames.count
        } else {
            return self.filteredRal.count
        }
 
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let cellIdentifier = "Cell"
        
        let cell = self.tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MainTableViewCell

        // Configure the cell...
        
        if tableView == self.tableView {
            cell.titleLabel?.text = self.ralNames[indexPath.row]
        } else {
            cell.titleLabel?.text = self.filteredRal[indexPath.row]
        }
        
        cell.cellImage?.image = UIImage(named: ralImages[indexPath.row])

        return cell
    }
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showDetailsSegue" {
            if let indexPath = self.tableView.indexPathForSelectedRow {
                let destinationVC = segue.destinationViewController as! DetailsViewController
                destinationVC.ralImage = self.ralImages[indexPath.row]
                destinationVC.ralName = self.ralNames[indexPath.row]
            }
        }
  • Вопрос задан
  • 243 просмотра
Пригласить эксперта
Ответы на вопрос 4
maximglobak
@maximglobak
iOS developer
Распиши как у тебя работает мето didSelectRowAtIndexPath. Скорее всего при клике на ячейку ты берешь данные из массива ralNames, а надо из filteredRal.
Ответ написан
@GoGetPrice
Ты отправляешь в этом Segue данные не того массива, тебе надо туда отправлять данные массива поиска
Делай проверку на активность поиска, если активен, то передавай данные из одного массива, если нет, то другого.

А так лучше это делать через didSelectRowAtIndexPath.
Ответ написан
Комментировать
@korolevsky_s Автор вопроса
iOS Developer
Теперь въехал. У меня результат поиска отображается в resultController, поэтому спасла вот такая муть... ))) Да, нужно ее допилить, но уже хоть все работает. ) Почти все... при поиске сбивается порядок картинок в таблице...
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showDetailsSegue" && searchController.active {
            if let indexPath = self.resultsController.tableView.indexPathForSelectedRow {
                let destinationVC = segue.destinationViewController as! DetailsViewController
                destinationVC.ralImage = self.ralImages[indexPath.row]
                destinationVC.ralName = self.filteredRal[indexPath.row]
            } else if let indexPath = self.tableView.indexPathForSelectedRow {
                let destinationVC = segue.destinationViewController as! DetailsViewController
                destinationVC.ralImage = self.ralImages[indexPath.row]
                destinationVC.ralName = self.ralNames[indexPath.row]
            }
        }
        
        if segue.identifier == "showDetailsSegue" {
            if let indexPath = self.tableView.indexPathForSelectedRow {
                let destinationVC = segue.destinationViewController as! DetailsViewController
                destinationVC.ralImage = self.ralImages[indexPath.row]
                destinationVC.ralName = self.ralNames[indexPath.row]
            }
        
        }
    }
Ответ написан
Комментировать
@FlooDwm
Нашел решение!
let cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы