Ios SQLite.swift:在活动搜索中点击UITableViewCell时,由于强制展开零值,应用程序崩溃
我已经在我的Ios SQLite.swift:在活动搜索中点击UITableViewCell时,由于强制展开零值,应用程序崩溃,ios,swift,sqlite.swift,Ios,Swift,Sqlite.swift,我已经在我的ViewController中添加了一个UISearchBar,其中还有一个UITableView,它是由来自SQLite数据库的数据使用“feed”的 搜索工作正常,搜索时所有结果均正确显示。通过单击一个TableViewCell调用DetailView也可以正常工作,但是当我在活动搜索过程中单击一个单元格时,应用程序崩溃 奇怪的是:它在模拟器中工作正常,没有崩溃,但在我的物理设备上却不行。我正在使用最新的XCode 9和XCode 9测试版,并在iOS 11.3或11.4中启动该
ViewController
中添加了一个UISearchBar
,其中还有一个UITableView
,它是由来自SQLite数据库的数据使用“feed”的
搜索工作正常,搜索时所有结果均正确显示。通过单击一个TableViewCell
调用DetailView也可以正常工作,但是当我在活动搜索过程中单击一个单元格时,应用程序崩溃
奇怪的是:它在模拟器中工作正常,没有崩溃,但在我的物理设备上却不行。我正在使用最新的XCode 9和XCode 9测试版,并在iOS 11.3或11.4中启动该应用程序
我试过几种方法,但我就是不知道是什么原因造成了这次车祸。我正在粘贴整个ViewController
。我已经标记了使用代码的部分,这些代码取自添加的框架/扩展
错误显示:
“线程1:致命错误:在展开可选值时意外发现nil。”
这是SQLite.swift中错误所指的部分:
func value<A: Value>(_ v: Binding?) -> A {
return value(v!)
}
在我找到错误的来源后,我会回答我自己的问题 我的问题中的
ViewController
中没有出现错误。它发生在DetailViewController
中的viewDidLoad()
中,我从SQLite
数据库中获取了要在细节中显示的缺失数据
以下是经过研究和检查SQLite.swift
的GitHub后的解决方案:
要获取一行的列值,其中您已经知道另外两个值,您需要从双过滤器中选择abinding
。事情是这样的:
let wantedValue = try! database.scalar(history.select(valueLookingFor).filter(knownValue1 == firstKnownValue && knownValue2 == secondKnownValue))
没有错误,不再崩溃。为什么要强制展开可选参数?这需要修正。要么删除参数中的?
,要么正确处理v
的nil值。我怀疑这是崩溃的原因,但当搜索文本更改时,您永远不会更新filteredDates
。您可能需要创建一个包含名称和日期的结构bankInfo
;然后在银行里放满这样的例子。这样,您的筛选就会更简单,只需筛选一个数组来创建Filteredbank,而不是试图使两个数组(Filteredbank和filteredDates)保持同步。@rmaddy谢谢,但我已经浏览了代码中的所有选项和强制展开,我想我不知道在哪里可以仔细查看。我改变了其中的一些,并测试了其他一些方法,但结果相同(崩溃)。“你能再给我一个提示看什么吗?”格拉克斯说,谢谢。你说得对-这不是崩溃的原因,但我以前测试过struct,因为我是初学者,所以无法将数组填充为struct或struct as array,或者不管它叫什么。所以我决定把它留到将来,当我能够理解a)这是什么,b)这甚至是:)@Aeger我指的是func值(v:Binding?->a{return value(v!)}
,你说的就是错误所在。
let wantedValue = try! database.scalar(history.select(valueLookingFor).filter(knownValue1 == firstKnownValue && knownValue2 == secondKnownValue))