ios - 我在使用协议(protocol)传递数据时做错了什么

标签 ios swift xcode uitableview

我正在尝试寻找一种“更简洁优雅”的方式在 UIViewController 之间传递数据。因此,我决定继续使用委托(delegate)和协议(protocol)。但是,我未能收到协议(protocol)提供的数据。我做错了什么?

尝试接收协议(protocol)数据并使用它来填充 UITableView:

class ViewController: UIViewController, CLLocationManagerDelegate,  UITableViewDataSource, dataReceivedDelegate {

    func dataReceived(nome: String, foto: UIImage, qtd: Int) {
        nomeReceived = nome
        self.qtd = qtd
        self.itensTableView.reloadData()

    }

    @IBOutlet weak var itensTableView: UITableView!
    var arrayNomes = NSMutableArray()
    var nomeReceived = ""
    var qtd:Int = 0
    var objetos = [Objeto]()

    //TableView
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

//        let item = objetos[indexPath.row]
        let cell = itensTableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! tableviewCell
        cell.nameCell.text = nomeReceived //Nil value
//        cell.imageViewCell.image = item.foto //Nil value
        return cell
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return qtd
    }
    override func viewDidAppear(_ animated: Bool) {
        let controller = storyboard?.instantiateViewController(withIdentifier: "addVc") as! adicionarNovoItemVc
        controller.delegate = self
    }

为协议(protocol)创造和设定值(value):

import UIKit

protocol dataReceivedDelegate {
    func dataReceived(nome:String,foto:UIImage,qtd:Int)
}

class adicionarNovoItemVc: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate {

    @IBOutlet weak var textFieldNome: UITextField!
    let imagePicker = UIImagePickerController()
    @IBOutlet weak var namePreview: UILabel!
    @IBOutlet weak var imagePreview: UIImageView!
    let picker = UIImagePickerController()

    var delegate:dataReceivedDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.textFieldNome.delegate = self
        // Do any additional setup after loading the view.

    }
      @IBAction func botaoAdcItem(_ sender: UIButton) {
        if (self.namePreview!.text != nil) && (self.imagePreview!.image != nil) {

            delegate?.dataReceived(nome: self.namePreview.text!, foto: self.imagePreview.image!, qtd: 1)


            self.navigationController?.popViewController(animated: true)
        }
        else {return}
}

最佳答案

在您的 ViewController 中向按钮添加一个操作,

func buttonAction(sender: UIButton!) {
    let storyboard = UIStoryboard.init(name: "yourStoryboarName", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "addVc") as! adicionarNovoItemVc
    controller.delegate = self
    self.navigationController?.pushViewController(controller, animated: true)
}

一旦新 Controller 被推送到屏幕上,您就可以执行“botaoAdcItem”操作,其余的将获得您预期的结果。

关于ios - 我在使用协议(protocol)传递数据时做错了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51227932/

相关文章:

json - 什么是 JSONSerialized URLRequest 的复杂键对值的正确 Swift 3 数据类型

ios - 如何在 xcode 中为使用 swift 制作的 spritekit 游戏创建主菜单?

xcode - Xcode 服务在此服务器上被禁用

ios - 升级到 iOS 5.1 和 xcode 4.3,现在应用程序无法安装

ios - 有效地将 Swift 数组复制到 iOS Metal 的内存缓冲区

ios - 推送授权未出现在分发配置文件中

iOS Storyboard : Not able to instantiate view controller properly

ios - 初学者在iOS中使用assimp

xcode - 带有Phonegap和Xcode的HTML5音频的Onclick

c++ - 找不到 wchar.h 文件 - Xcode 9.0 破坏了 Qt Creator - 旧修复不起作用