尝试将数据设置为Struct时我做错了什么

时间:2018-07-06 23:45:06

标签: swift struct

我正在尝试创建一个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()
     }

故事板:

enter image description here

3 个答案:

答案 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 }
}