Ios 从另一个ViewController Swift 4访问对象(SQLite表)
我是swift新手,我正在尝试返回表中的指定列以在单独的viewcontroller中显示。我已经使用SQLite.swift定义了一个函数,它以数组的形式返回它们,就像我希望的那样。(在同一个viewcontroller中调用时,它会工作) 我收集到的信息是,由于我在没有表的情况下从viewcontroller调用函数,因此它无法获得所需的信息 这是第一个viewcontroller中的数据库Ios 从另一个ViewController Swift 4访问对象(SQLite表),ios,swift,xcode,sqlite,sqlite.swift,Ios,Swift,Xcode,Sqlite,Sqlite.swift,我是swift新手,我正在尝试返回表中的指定列以在单独的viewcontroller中显示。我已经使用SQLite.swift定义了一个函数,它以数组的形式返回它们,就像我希望的那样。(在同一个viewcontroller中调用时,它会工作) 我收集到的信息是,由于我在没有表的情况下从viewcontroller调用函数,因此它无法获得所需的信息 这是第一个viewcontroller中的数据库 func returncolumns() -> Array<String> {
func returncolumns() -> Array<String> {
print("RETURNING")
var namearray = [String]()
do {
for wardrobe in try wardrobedb.prepare(wardrobe.select(name)) {
namearray.append(wardrobe[name])
}
} catch {
print("This no worko \(error)")
}
return namearray
}
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var wardrobedb: Connection!
let wardrobe = Table("wardrobe")
let id = Expression<Int64>("id")
let name = Expression<String>("name")
let type = Expression<String>("type")
let color = Expression<String>("color")
let style = Expression<String>("style")
let weight = Expression<String>("weight")
let pattern = Expression<String>("pattern")
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
do {
let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileUrl = documentDirectory.appendingPathComponent("wardrobe").appendingPathExtension("sqlite3")
let wardrobedb = try Connection(fileUrl.path)
// let wardrobedb = try remove(fileUrl.path)
self.wardrobedb = wardrobedb
} catch {
print(error)
}
}
这里是第一次调用viewcontroller
func returncolumns() -> Array<String> {
print("RETURNING")
var namearray = [String]()
do {
for wardrobe in try wardrobedb.prepare(wardrobe.select(name)) {
namearray.append(wardrobe[name])
}
} catch {
print("This no worko \(error)")
}
return namearray
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "wardrobemove" {
// if let destinationVC = segue.destination as? WardrobeTableViewController {
WardrobeTableViewController().clothes = returncolumns()
/// }
}
}
func returncolumns()->数组{
打印(“返回”)
变量namearray=[String]()
做{
对于衣柜,请尝试衣柜数据库。准备(衣柜。选择(名称)){
namearray.append(衣柜[名称])
}
}抓住{
打印(“此无工作\(错误)”)
}
返回名称数组
}
覆盖功能准备(对于segue:UIStoryboardSegue,发送方:有吗?){
如果segue.identifier==“衣柜移动”{
//如果让destinationVC=segue.destination作为?WardrobeTableViewController{
WardrobeTableViewController().Cloth=returncolumns()
/// }
}
}
所以在这里,我将“wardrobemove”识别为进入导航控制器的序列。我注释掉了if语句,因为在本例中,目标viewcontroller是导航控制器,而不是存储衣服数组的WardrobeTableViewController。当我运行调试器时,我看到它传递信息和分配的衣服数组。但在那之前它还是消失了
在导航控制器和WardrobeTableViewController之间有一个表视图控制器,该控制器有几个单元格,当选择第一个单元格时,它将打开WardrobeTableViewController
这有点乱,我遵循了两个指南,我认为第二个引入导航控制器的指南有点乱。编辑2:您没有设置执行segue的类实例的Cloth属性(但您正在设置一个新实例)。像这样改变:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
//check if the performed segue has "wardrobemove" id
if segue.identifier == "wardrobemove" {
//check if the destination is kind of WardrobeTableViewController
if let destinationVC = segue.destination as? WardrobeTableViewController {
//if it is so, then set its property clothes
destinationVC.clothes = returncolumns()
}
}
}
编辑
在第二个vc中,每次设置衣服数组时都要重新加载tableView:
var clothes = [String]() {
didSet {
self.tableView.reloadData()
}
}
旧答案
var clothes = ViewController().returncolumns()
您在第一个VC中拥有所有内容,并且希望根据方法returncolumns()返回的值在第二个VC中设置衣服
如果是这样的话,您可能希望在FirstVC和SecondVC之间执行一个segue,并实现prepareForSegue来设置衣服。比如:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segueIdentifier" {
if let destinationVC = segue.destination as? SecondViewController {
destinationVC.clothes = returncolumns()
}
}
}
嗨,我想我已经接近这一点了。我在调试器中看到,它正在为第二个视图控制器中的衣服数组分配正确的值。问题是,一旦我离开第一个控制器并转到第二个控制器,数组现在是空的。我不知道为什么我加了它。这很简单。我读到它可能与导航控制器导致以前的值去分配有关?但是我对此不太确定。请看我的编辑,如果一切都设置正确,那么您唯一错过的就是在设置阵列后重新加载表格。衣服变量的第二个设置显示无效的重新声明。如果我注释掉那一行,那么在到达第二个视图控制器后,我仍然看到一个空数组。是的,这是旧答案的一部分。如果你和我们分享你如何完成这个过程和准备的代码,也许我们能弄明白
var clothes = ViewController().returncolumns()
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segueIdentifier" {
if let destinationVC = segue.destination as? SecondViewController {
destinationVC.clothes = returncolumns()
}
}
}