问题描述
我有两个表视图,这些表视图是根据所选择的单元格从Arrays提取的数据填充的。我介绍了一些结构,最初只是使用Strings数组,我试图提取正确的数据并使用填充正确的字段他们。所以我有这个结构:
struct DetailView {
var detailTitle : String
//var equipmentImage = [UIImageView?]()
var serN : String
var dc : String //deck Code
var an : String //area name
var sn : String //Space number
var manuf : String
var qty : String
init(detailTitle:String,dc:String,serN:String,an:String,sn:String,manuf:String,qty:String){
self.detailTitle = detailTitle
self.dc = dc
self.an = an
self.serN = serN
self.sn = sn
self.manuf = manuf
self.qty = qty
//
}
}
我有这个数组:
//we are adding elements on the detailView structure
var thirdArray : [DetailView]= []
我填充了它:
thirdArray = thirdArray = [[
DetailView(detailTitle: "A",dc: "",serN: "Info required",an: "Area Name required",sn: "Space Number Required",manuf: "APC",qty: "2")],[DetailView(detailTitle: "B",manuf: "Apple",qty: "12"),DetailView(detailTitle: "D",qty: "7"),DetailView(detailTitle: "E",qty: "1")],[DetailView(detailTitle: "F",manuf: "Autonomic",qty: "1")]]
然后我在其中进行填充:
override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
let row = self.tableView?.indexPathForSelectedRow?.row ?? 0
let destViewController = segue.destination as! SecondTableViewController
var detailArray : [DetailView]
detailArray = thirdArray
destViewController.detailVcArray = detailArray
}
在第二个表格视图中,我有:
var detailVcArray : [DetailView] = []
override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
let destViewController = segue.destination as! DetailsViewController
let row = self.tableView?.indexPathForSelectedRow?.row ?? 0
var lastArray : [DetailView]
lastArray = detailVcArray
destViewController.displayDetail = lastArray[row]
//here I get this error "Thread 1: Fatal error: Index out of range"
}
最后在我的DetailsViewController上,我想用来自我的结构的dc数据填充DC文本字段,并用detailTitle等填充textView。但是应用程序崩溃了。
var displayDetail : DetailView?
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var serN: UITextField!
@IBOutlet weak var dc: UITextField!
@IBOutlet weak var an: UITextField!
@IBOutlet weak var sn: UITextField!
@IBOutlet weak var manuf: UITextField!
@IBOutlet weak var qty: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textView.text = displayDetail?.detailTitle
dc.text = displayDetail?.dc
serN.text = displayDetail?.serN
an.text = displayDetail?.an
sn.text = displayDetail?.sn
manuf.text = displayDetail?.manuf
qty.text = displayDetail?.qty
updateTextView()
}
我收到此错误“线程1:致命错误:索引超出范围”,当我从最后一台电视中选择一个单元并尝试在最后一个VC上显示数据时,应用程序崩溃。
解决方法
我建议围绕您需要显示的内容重新设计数据模型。最后,您需要2个字符串,因此创建该结构。
struct Detail {
var detailTitle: String
var dc: String
}
您想将它们组织为一个数组数组以匹配您的两个表。
let detailArray = [[Detail(detailTitle: "A",dc: "BO")],[Detail(detailTitle: "B",dc: "Apple"),Detail(detailTitle: "C",Detail(detailTitle: "D",dc: "Apple")],[Detail(detailTitle: "A",dc: "BD")]
// ...
]
您的搜索选择了正确的数组,并将其传递给第二个表的数据源,即...
var detailVcArray: [Detail]
最后一个控制器接收到它所需要的...
var displayDetail: Detail
此时,您可以使用这些值。
textView.text = displayDetail.detailTitle
dc.text = displayDetail.dc