Что я делаю неправильно при передаче данных с помощью протоколов

TituJow спросил: 13 июня 2018 в 10:45 в: ios

Я пытаюсь найти "более чистый-элегантный" способ передачи данных между UIViewControllers. Поэтому я решил продолжить использование делегатов и протоколов. Однако мне не удалось получить данные, предоставленные моим Протоколом. Что я делаю неправильно?

Попытка получить данные протокола и использовать его для заполнения 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
    }

Создание и установка значения для протокола:

import UIKitprotocol 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}
}

1 ответ

Есть решение
nikBhosale ответил: 15 июня 2018 в 04:01

В вашем 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)
}

После того, как новый контроллер будет нажат на экран, вы можете выполнить действие "botaoAdcItem", и остальная часть получит ожидаемый результат.

TituJow ответил: 15 июня 2018 в 04:02
Работал совершенно человеком! Спасибо огромное!

Дополнительное видео по вопросу: Что я делаю неправильно при передаче данных с помощью протоколов

10 ВЕЩЕЙ, КОТОРЫЕ ТЫ ДЕЛАЕШЬ НЕПРАВИЛЬНО!

Вопросы подписчиков №1. Пишем код правильно

Создаем проект правильно (Cocoapods, MVC)