0

我正在尝试创建一个能够在屏幕之间传递数据的结构。但是,当我将数据设置为我的 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()
     }

故事板:

在此处输入图像描述

4

3 回答 3

1

在您的第二个代码片段中,您永远不会初始化objetos任何东西。因此,当您尝试在 上设置属性之一时objetos,什么也没有发生,因为objetos不存在。

objetos解决方案:在尝试使用它之前进行初始化。

于 2018-07-06T23:51:18.650 回答
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
}
于 2018-07-06T23:54:57.917 回答
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需要将创建的数据传递回原始视图控制器时,一种方法是

@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 }
}
于 2018-07-07T00:36:04.050 回答