当我在 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
中将itemCd
和itemName
声明为非可选。只有极少数情况下,将String
和Int
等原始 类型声明为可选类型很有用。
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 时如何传递数据?的主要内容,如果未能解决你的问题,请参考以下文章
iOS,Swift 3 - 当我从详细视图返回后单击取消时,UISearchBar 消失