当我在 swift 4 中单击 uitableviewcell 时如何传递数据?

Posted

技术标签:

【中文标题】当我在 swift 4 中单击 uitableviewcell 时如何传递数据?【英文标题】:how to pass data when i click the tableviewcell in swift4? 【发布时间】:2018-11-20 04:32:18 【问题描述】:

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

所以在另一个ViewController中要执行的SQL语句没有被执行。 ViewDidLoad 中出现可选错误。

我也使用了override prepare函数,但是结果是一样的。 我不明白为什么会这样。

 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)

其他视图控制器:

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() 
        ...

【问题讨论】:

first : 1, second : Optional(1)。这里itemCd -> 1 & Optional(1)second -> first & second ryt ? @dinggu 你的问题解决了吗? 这可能会有所帮助***.com/questions/5210535/… _infoVC.itemName = String(描述:itemName) 【参考方案1】:

根据您的代码执行 segue,因此您需要在控制器中实现 func prepare(for segue: UIStoryboardSegue, sender: Any?) 并传递值。

代码:

 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
        

【讨论】:

【参考方案2】:

    HistviewController 中将itemCditemName 声明为非可选。只有极少数情况下,将StringInt原始 类型声明为可选类型很有用。

    var itemCd = 0
    var itemName = ""
    

    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 

【讨论】:

以上是关于当我在 swift 4 中单击 uitableviewcell 时如何传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 错误 - 方法不覆盖其超类中的任何方法

Swift:UIButton 不可点击的重叠视图

如何在swift 4中消失没有按钮的侧边菜单

iOS,Swift 3 - 当我从详细视图返回后单击取消时,UISearchBar 消失

在 swift 4 上单击 UIWebview 上的播放视频时出错

当我在 Xcode 11 中将 swift 4.2 转换为 swift 5 时继续加载