我想将数据从表视图发送到另一个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() {
...}
答案 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)
在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 {