Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从另一个ViewController Swift 4访问对象(SQLite表)_Ios_Swift_Xcode_Sqlite_Sqlite.swift - Fatal编程技术网

Ios 从另一个ViewController Swift 4访问对象(SQLite表)

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> {

我是swift新手,我正在尝试返回表中的指定列以在单独的viewcontroller中显示。我已经使用SQLite.swift定义了一个函数,它以数组的形式返回它们,就像我希望的那样。(在同一个viewcontroller中调用时,它会工作)

我收集到的信息是,由于我在没有表的情况下从viewcontroller调用函数,因此它无法获得所需的信息

这是第一个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
}
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()
        }
    }
}