从屏幕传递数据到屏幕xcode?
我有这样的代码在我ViewController1从屏幕传递数据到屏幕xcode?
var calendarios = [Calendario]()
var totalCalendarios1 = 0
(当屏幕负载totalCalendarios变化和它说,总的正确,我可以看到它在调试) ,我希望它传递给我的ViewController2,我有做这个代码:
let copiaCalendarios = ViewController1()
let totalCalendarios2 = copiaCalendarios.totalCalendarios1
我打印了第二个值,它说0,总是,它没有关系,以前。
我已经使用这个代码太:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destino = segue.destination as? ViewController
destino?.calendariosCopia = calendarios
}
,但不起作用。 我在做什么错? 搜索的信息,但它是过时的
编辑: 这是我的原代码: CalendarioViewController是我的第二个VC和CalendarioTableViewController是我的第一个VC和是发送者。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destino = segue.destination as? CalendarioViewController
destino?.calendariosCopia = calendarios
}
这是我的代码有使用,而这一个了:
let copiaCalendarios = CalendarioTableViewController()
let totalCalendarios = copiaCalendarios.totalCalendarios
两个VC
有var totalCalendarios = 0
THX IND提前和对不起我的英语不好:$
EDIT2: 这与segue的种类有关吗? 因为我用 '出席模态'
EDIT3: CalendarioTableViewController:
//
// CalendarioTableViewController.swift
// Vizion5
//
// Created by ROB on 16/04/17.
// Copyright © 2017 ROB. All rights reserved.
//
import UIKit
class CalendarioTableViewController: UITableViewController {
var calendarios = [Calendario]()
var totalCalendarios = 0
func cargarEjemplos() {
guard let calendario1 = Calendario(nombre: "2017-A", fin: "17/01/2017", inicio: "05/05/2017") else {
fatalError("Error en calendario table view controller")
}
guard let calendario2 = Calendario(nombre: "2016-A", fin: "17/01/2016", inicio: "05/05/2016") else {
fatalError("Error en calendario table view controller")
}
calendarios += [calendario1, calendario2]
}
func contarCalendarios() {
totalCalendarios = calendarios.count
}
//AÑADIDO AUTOMATICAMENTE
override func viewDidLoad() {
super.viewDidLoad()
//CARGA LOS EJEMPLOS
cargarEjemplos()
contarCalendarios()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return calendarios.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//let identificadorCelda = "tablaCalendario"
guard let cell = tableView.dequeueReusableCell(withIdentifier: "tablaCalendario", for: indexPath) as? CalendarioTableViewCell
else {
fatalError("error 1: calendario table controller")
}
let calendario = calendarios[indexPath.row]
// Configure the cell...
cell.nombreCalendario.text = calendario.nombre
cell.finCalendario.text = calendario.fin
cell.inicioCalendario.text = calendario.inicio
return cell
}
//MARK: ACCIONES
@IBAction func regresarATablaCalendario(sender: UIStoryboardSegue) {
if let viewControllerOrigen = sender.source as? CalendarioViewController, let calendario = viewControllerOrigen.calendario {
//AÑADE EL NUEVO CALENDARIO
let newIndexPath = IndexPath(row: calendarios.count, section: 0)
calendarios.append(calendario)
tableView.insertRows(at: [newIndexPath], with: .automatic)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print("Total calendarios es: " + String(totalCalendarios))
let destino = segue.destination as? CalendarioViewController // here you have to use the exact name of your Second View Controller instead of ViewController
destino?.totalCalendarios = totalCalendarios
}
}
我CalendarioViewController
//
// CalendarioViewController.swift
// Vizion5
//
// Created by ROB on 16/04/17.
// Copyright © 2017 ROB. All rights reserved.
//
import UIKit
class CalendarioViewController: UIViewController, UITextFieldDelegate, UINavigationControllerDelegate {
@IBOutlet weak var nombreCalendario: UITextField!
@IBOutlet weak var fechaInicioCalendario: UIDatePicker!
@IBOutlet weak var fechaFinCalendario: UIDatePicker!
@IBOutlet weak var botonGuardar: UIBarButtonItem!
var totalCalendarios = 0
//ESTE VALOR SERA PASADO POR 'CALENDARIOVIEWCONTROLLER' EN 'PREPARE(FOR: SENDER:)' O CONTRUIDO PARA AGREGAR UN NUEVO CALENDARIO
var calendario: Calendario?
override func viewDidLoad() {
super.viewDidLoad()
nombreCalendario.delegate = self //SE CONTROLA A SI MISMO
print("Total segue: " + String(totalCalendarios))
//CHECA SI SE PUEDE HABILITAR EL BOTON DE GAURDADO
//DESABILITA EL BOTON DE GUARDADO
botonGuardar.isEnabled = false
//actualizaEstadoBotonGuardar()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//MARK: FUNCIONES DE TECLADO Y DETERMINAR FECHA (QUE EL FIN SEA MAYOR QUE INICIO)
func textFieldDidBeginEditing(_ textField: UITextField) {
botonGuardar.isEnabled = false
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
//SE DESHABILITA EL BOTON DE GUARDAR CUANDO SE ESCRIBE
botonGuardar.isEnabled = false
//ESCONDE EL TECLADO AL PRESIONADO "HECHO" (DONE)
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
actualizaEstadoBotonGuardar()
//navigationItem.title = textField.text
}
// MARK: - NAVEGACION (UNWIND SEGUE)
@IBAction func botonCancelar(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
}
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
//super.prepare(for: segue, sender: sender)
guard let button = sender as? UIBarButtonItem, button === botonGuardar else {
print("Error en prepare sender")
return
}
let setFormatoFecha = DateFormatter()
setFormatoFecha.dateFormat = "dd/MM/yyyy"
let nombre = nombreCalendario.text
let fin = setFormatoFecha.string(from: fechaFinCalendario.date)
let inicio = setFormatoFecha.string(from: fechaInicioCalendario.date)
//SE INSERTAN LOS DATOS LEIDOS.
calendario = Calendario(nombre: nombre!, fin: fin, inicio: inicio)
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
//MARK: METODOS PRIVADOS
private func actualizaEstadoBotonGuardar() {
//DESHABILITA EL BOTON DE GUARDAR CUANDO ESTA EN BLANCO *WIP*
let texto = nombreCalendario.text ?? ""
let tieneTexto = !texto.isEmpty
//WIP
if (!texto.isEmpty) {
if (fechaInicioCalendario.date >= fechaFinCalendario.date) {
botonGuardar.isEnabled = false
} else {
botonGuardar.isEnabled = true
}
}
}
}
让我知道我错了,你的代码是一个有点混乱给我。 (我会编辑)
您的totalCalendarios1
是ViewController1
的实例中的值。在我看来,您希望将此值传递给ViewController2
,并将其转换为名为totalCalendarios2
的变量。
首先,你有一个(小)的错误:
let totalCalendarios2 = copiaCalendarios.totalCalendarios
难道不该totalCalendarios1
? (这是我对你的命名规则感到困惑的地方,希望这可能是一个语言问题,或者你简化你的代码到打错字的地步。)
不管怎样,这是一个小问题。 真实问题与您的segue代码。这就是你要纠正的地方。
比方说,你有以下几种:
ViewController1:
var totalCalendarios:Int = 0
ViewController2
var totalCalendarios:Int = 0
现在ViewController1
这个variabl e被更新为不同的值,可能是2017,并且您希望将此值传递给ViewController2。所有你需要的 - 只要你有一个定义赛格瑞 - 是:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MySegueName" {
if let vc = segue.destination as? ViewController2 {
vc.totalCalendarios = totalCalendarios
}
}
}
相比代码发布,最大的错误是铸造你的目的地VC为ViewController
而不是ViewController2
。我看到其他潜在的问题,但是你的变量不足以让我知道它们是否也是一个问题。
总之:
- 除非你根本无法保持变量名相同,有鉴于控制器之间的事物命名一样没有问题。事实上,它有助于他人理解你的代码。
- 如果您使用的是segue,则不需要实例化任何视图控制器。但你应该转换目标VC正确在准备(for segue :)。
- 铸造后,只需传递变量。
是的,我纠正了代码,它是totalCalendarios1,对不起,我会尝试你的代码,thx:D –
我假设你的班级名称是ViewController1
,如你所说。没关系。但你是如何获得let totalCalendarios2 = copiaCalendarios.totalCalendarios
?它是一个错字还是你实际上在你的代码中写了这行?它应该是:
let totalCalendarios2 = copiaCalendarios.totalCalendarios1
好吧,如果你真的想从一个屏幕数据传递到另一个屏幕(其实这是一个控制器到另一个控制器)如下:
-
您的第一个视图控制器(从你想传递的地方),拥有你想传递的数据类型的属性。为您的情况:
var totalCalendarios = 0
现在根据您的需要更新此
totalCalendarios
。 将数据传递与
segue
,则需要在界面添加赛格瑞生成器(从源头控制到目标控制器),并给予segue
的名称。比方说,CalenderSegue
-
在你的第二个视图控制器(要在其中传递),你需要有精确的类型,你是从第一个传递数据的属性。在你的情况下,它是
Int
。因此,在你的第二个视图控制器声明一个属性:var totalCalendarios = 0
-
现在使用这个
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let identifier = segue.identifier, identifier = "CalenderSegue" { let destino = segue.destination as? CalendarioViewController // here you have to use the exact name of your Second View Controller instead of ViewController destino?.totalCalendarios = totalCalendarios } }
编辑:1
从CalendarioViewController
类中删除这些行(你不不需要为您的CalendarioTableViewController
创建对象)
let copiaCalendarios = CalendarioTableViewController()
let totalCalendarios = copiaCalendarios.totalCalendarios
一下添加到CalendarioViewController
类
var totalCalendarios = 0
而且从上面使用prepare(for segue: UIStoryboardSegue, sender: Any?)
方法。
但如果你只有一个赛格瑞,并且已经从
TableViewCell
到CalendarioViewController
添加它,那么你可以使用
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destino = segue.destination as? CalendarioViewController // here you have to use the exact name of your Second View Controller instead of ViewController
destino?.totalCalendarios = totalCalendarios
}
编辑:2
你可能有问题与segue
。从TableViewCell
中删除所有segue
,然后将它们添加回来。如果你不知道该怎么办,看到这个
是的,我已经更正了代码,它是totalCalendarios1,对不起,我会尝试你的代码,thx:D –
我在segue的一段代码中添加了一个打印语句,它打印var totalCalendarios,并显示2(总的日历加载),然后在calendarioViewController的viewDidLoad()中打印totalCalendarios,它表示0.结果如下: Total Calendarios(segue):2 Total Calendarios(CalendarioViewController):0 –
@MartinHernandezPerez是否在'prepare(for:sender:)'方法中正确使用'destino?.totalCalendarios = totalCalendarios'? – nayem
你似乎有一个错字。 'ViewController'而不是'ViewController1'。 –
你想传递'[Calendario]'对象还是只传递'totalCalendarios' var? – nayem
only totalCalendarios –