Я добавил UISearchBar в свой ViewController, и в нем тоже есть UITableView, который является «кормили" по данным из базы данных SQLite с использованием SQLite.Swift».
Поиск работает, все результаты при поиске отображаются корректно. Вызов DetailView при нажатии на TableViewCell также работает нормально, но когда я нажимаю на ячейку в течение при активном поиске, приложение вылетает.
Странная вещь: в симуляторе все работает без сбоев, но не на моем физическом устройстве. Я использую последние бета-версии XCode 9 и XCode 9, и я запускаю приложение в iOS 11.3 или 11.4.
Я пробовал несколько вещей, но не могу понять, что вызывает сбой. Прошиваю весь ViewController. Я отметил разделы, в которых используется код, взятый из добавленных фреймворков / расширений.
Ошибка говорит:
"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value."
Это раздел, на который ссылается ошибка в SQLite.swift:
func value<A: Value>(_ v: Binding?) -> A {
return value(v!)
}
Мне интересно, где это значение nil.
Вот мой код: спасибо за подсказки и помощь
Обновлено: Я отредактировал код, потому что ошибка возникла не в ViewController активного окна, а в DetailViewController, который должен отображаться после щелчка TableViewCell. Это строка, в которой возникает ошибка:
Этот код должен найти строку в базе данных, где имя и дата соответствуют заданным переменным, чтобы выбрать имя в этой строке:
let nameOfBank = try! database.scalar(table.filter(tableColumnName == cell?.textLabel?.text && tableColumnDate == cell?.detailTextLabel?.text).select(bankName))
Я сомневаюсь, что это источник сбоя, но вы никогда не обновляете filteredDates при изменении текста поиска. Возможно, вы захотите создать структуру bankInfo, содержащую имя и дату; и заполните bankArray экземплярами этого. Тогда ваша фильтрация будет проще, имея только один массив для фильтрации для создания filterBanks, вместо того, чтобы пытаться поддерживать синхронизацию двух массивов (filterBanks и filterDates).
@rmaddy, спасибо, но я пробежался по всем опциям и принудительным развертываниям, которые есть в коде, и я думаю, что не понимаю, где можно посмотреть. Я изменил некоторые из них и протестировал другие способы, но с тем же результатом (сбой). Не могли бы вы дать мне еще один совет, на что смотреть?
@GrahamPerks, спасибо. Вы правы - это не причина сбоя, но я тестировал эту структуру раньше, и, поскольку я новичок, я не смог заполнить массив как структуру или структуру как массив или как это называется. Поэтому я решил оставить это на будущее, когда смогу понять а) что это делает и б) когда это вообще есть :)
@Aeger Я имею в виду func value<A: Value>(_ v: Binding?) -> A { return value(v!) }, в котором вы указали ошибку.
@rmaddy ой, это код из оболочки SQLite.Swift. Когда я что-то меняю, я погребен в ошибках: D Я постараюсь исправить это сегодня вечером. Первые попытки не увенчались успехом. Спасибо за разъяснение.
Хорошо, мне удалось изолировать источник ошибки. Его даже нет в этом ViewController! Он находится в DetailView и возникает при разворачивании отдельных элементов в базе данных SQLite. Теперь мне нужно выяснить, как установить их на правильный query / filter / scalar. Все эти строчки написаны так: let result = try! database.scalar(history.filter(bankName == segueBankName && dateSave == segueBankDate).select(questionsResult)) Забавно: у меня точно такой же scalar есть в другом приложении, и он там работает. Единственное отличие: здесь я расширил фильтр, добавив &&. Необходимо проверить.





Я отвечаю на свой вопрос после того, как нашел источник ошибки.
Ошибка не возникла в ViewController внутри моего вопроса. Это произошло в viewDidLoad() в DetailViewController, где я извлек недостающие данные для отображения в деталях из базы данных SQLite.
Вот решение после исследования и проверки SQLite.swift на GitHub:
Чтобы получить значение столбца в строке, где вы уже знаете два других значения, вам нужно select и binding из двойного filter. А это выглядит так:
let wantedValue = try! database.scalar(history.select(valueLookingFor).filter(knownValue1 == firstKnownValue && knownValue2 == secondKnownValue))
Ни ошибок, ни сбоев.
Зачем вам принудительно разворачивать необязательный параметр? Это нужно исправить. Либо удалите
?в параметре, либо правильно обработайте нулевое значение дляv.