Я пытаюсь найти "более чистый-элегантный" способ передачи данных между 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}
}
В вашем ViewController добавьте действие к кнопке,
После того, как новый контроллер будет нажат на экран, вы можете выполнить действие "botaoAdcItem", и остальная часть получит ожидаемый результат.