当我在swift4中单击tableviewcell时如何传递数据?

时间:2018-11-20 04:32:19

标签: ios swift xcode

我想将数据从表视图发送到另一个ViewController的表视图。但是,传递数据时,数据将转换为可选类型。

因此,不会执行要在另一个ViewController中执行的SQL语句。 ViewDidLoad中发生可选错误。

我也使用了覆盖准备功能,但是结果是一样的。 我不明白为什么会这样。

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let itemCd = self.itemList[indexPath.row].itemCd
    let itemName = self.itemList[indexPath.row].itemName

    print(self.itemList[indexPath.row].itemCd)

    let infoVC = self.storyboard?.instantiateViewController(withIdentifier: "HIST_RVC")
    if let _infoVC = infoVC as? HistviewController {

        _infoVC.itemCd = Int(itemCd)
        _infoVC.itemName = String(itemName)

        print(_infoVC.itemCd)
        self.performSegue(withIdentifier: "moveHist", sender: self)
    }

打印时,我得到以下结果,

first : 1,
second : Optional(1)

其他viewController:

class HistviewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var itemCd: Int!
var itemName: String!
// SQLite DB
var infomationDAO = infoDAO()
var infoList: [InfoVO]!

override func viewDidLoad() {

    self.infoList = self.infomationDAO.find(itemCd: self.itemCd)
    self.tableview.reloadData()
}

sql find()函数:

func find(itemCd: Int = 0) -> [InfoVO] {

    var infoList = [InfoVO]()

    do {
        // define condition
        let condition = itemCd == 0 ? "": "WHERE a.item_cd = \(itemCd)"

        let sql = """
        select a.info_cd, a.info_name, b.item_name
        from info_table a
        join item_table b
        on a.info_name = b.item_name
        \(condition)
        order by a.item_cd ASC
        """

        let rs = try self.fmdb.executeQuery(sql, values: nil)

        while rs.next() {
        ...}

2 个答案:

答案 0 :(得分:1)

根据您的代码执行的测试,因此您需要在控制器中实现 func prepare(用于测试:UIStoryboardSegue,发件人:任何?),并传递值。

代码:

 var selectedIndex = 0
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let controller = segue.destination as? HistviewController {
                let itemCd = self.itemList[selectedIndex].itemCd
                let itemName = self.itemList[selectedIndex].itemName
                controller.itemcd = Int(itemcd)
                controller.itemName = String(itemName)
            }
        }

        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            self.selectedIndex = indexPath.row
        }

答案 1 :(得分:0)

  1. HistviewController中将itemCditemName声明为非可选。在极少数情况下,将诸如StringInt之类的原始类型声明为可选类型很有用。

    var itemCd = 0
    var itemName = ""
    
  2. init?(String)初始化程序返回一个可选参数,因为"abc"不能用Int表示。如果初始化失败,请使用nil-coalescing运算符传递0:

    _infoVC.itemCd = Int(itemCd) ?? 0
    

注意:在Swift中,请避免使用以下划线开头的变量名。这是 objective-c-ish 。写

if let infoVC = self.storyboard?.instantiateViewController(withIdentifier: "HIST_RVC") as? HistviewController {