我正在尝试创建一个Struct,以便能够在屏幕之间传递数据。但是,当我将数据设置为Struct属性时,然后尝试在另一个屏幕中使用它时,该值为“ nil”。我究竟做错了什么?
对象结构:
import UIKit
struct Objetos {
var nome: String
var foto: UIImage
}
这就是我要设置值的方式:
var objeto = Objeto(nome: "", foto: UIImage())
@IBAction func botaoAdcItem(_ sender: UIButton) {
if (self.namePreview!.text != nil) && (self.imagePreview!.image != nil) {
objeto?.nome = self.namePreview.text!
objeto?.foto = self.imagePreview.image!
self.navigationController?.popViewController(animated: true)
}
else { return }
}
这就是我试图读取数据的方式:
class ViewController: UIViewController, CLLocationManagerDelegate, UITableViewDataSource {
@IBOutlet weak var itensTableView: UITableView!
var arrayNomes = NSMutableArray()
var objeto: Objetos?
var objetos = [Objetos]()
//TableView
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
for nome in objetos {
arrayNomes.add(nome)
}
return arrayNomes.count //Nil value
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = itensTableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! tableviewCell
cell.nameCell.text = objeto?.nome //Nil value
cell.imageViewCell.image = objeto?.foto //Nil value
return cell
}
override func viewDidAppear(_ animated: Bool) {
self.itensTableView.reloadData()
}
故事板:
答案 0 :(得分:1)
在第二个代码段中,您永远不会将objetos
初始化为任何东西。因此,当您尝试在objetos
上设置属性之一时,什么都不会发生,因为objetos
不存在。
解决方案:初始化objetos
,然后再尝试使用它。
答案 1 :(得分:0)
如果要将数据设置为以前的VC,可以尝试使用此方法
// ! won't crash
let count = self.navigationController.viewControllers!.count
let tab = self.navigationController.viewControllers![count-2] as! UITabBarController
let vc = tab.viewControllers![0] as! ViewController
vc.objetos.append(Objetos(name:self.namePreview.text!,foto:self.imagePreview.image!))
self.navigationController?.popViewController(animated: true)
加
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = objectos[indexPath.row]
let cell = itensTableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! tableviewCell
cell.nameCell.text = item.nome //Nil value
cell.imageViewCell.image = item.foto //Nil value
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objetos.count
}
答案 2 :(得分:0)
尝试替换
var objetos:Objetos?
与
var objeto = Objetos(nome: "", foto: UIImage())
您将对象作为可选对象启动,因此从零开始。尝试在结构中分配属性时,您会失败,因为从一开始就不存在该对象
关于其他nil值,这是您的代码段的修订视图
class ViewController: UIViewController, CLLocationManagerDelegate, UITableViewDataSource {
@IBOutlet weak var itensTableView: UITableView!
var objetos = [Objetos]()
//TableView
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objetos.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = itensTableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! tableviewCell
let objeto = objectos[indexPath.row]
cell.nameCell.text = objeto.nome
cell.imageViewCell.image = objeto.foto
return cell
}
override func viewWillAppear(_ animated: Bool) {
self.itensTableView.reloadData()
}
在您的Additional Novo Itens Vc
中,您需要将创建的数据传回原始View Controller,一种方法是
@IBAction func botaoAdcItem(_ sender: UIButton) {
if (self.namePreview!.text != nil) && (self.imagePreview!.image != nil) {
// create the objecto
var objeto = Objetos(nome: namePreview.text,
foto: imagePreview.image)
// create a reference to your previous view controller
let vc = self.navigationController?.viewControllers[0] as! ViewController
// add objecto to objectos
vc.objetos.append(objeto)
self.navigationController?.popViewController(animated: true)
}
else { return }
}