2017-04-19 48 views
-5

我有这样的代码在我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 
      } 
     } 
    } 

} 
+0

你似乎有一个错字。 'ViewController'而不是'ViewController1'。 –

+0

你想传递'[Calendario]'对象还是只传递'totalCalendarios' var? – nayem

+0

only totalCalendarios –

回答

0

让我知道我错了,你的代码是一个有点混乱给我。 (我会编辑)

您的totalCalendarios1ViewController1的实例中的值。在我看来,您希望将此值传递给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 :)
  • 铸造后,只需传递变量。
+0

是的,我纠正了代码,它是totalCalendarios1,对不起,我会尝试你的代码,thx:D –

0

我假设你的班级名称是ViewController1,如你所说。没关系。但你是如何获得let totalCalendarios2 = copiaCalendarios.totalCalendarios?它是一个错字还是你实际上在你的代码中写了这行?它应该是:

let totalCalendarios2 = copiaCalendarios.totalCalendarios1 

好吧,如果你真的想从一个屏幕数据传递到另一个屏幕(其实这是一个控制器到另一个控制器)如下:

  1. 您的第一个视图控制器(从你想传递的地方),拥有你想传递的数据类型的属性。为您的情况:

    var totalCalendarios = 0 
    

    现在根据您的需要更新此totalCalendarios

  2. 将数据传递与segue,则需要在界面添加赛格瑞生成器(从源头控制到目标控制器),并给予segue的名称。比方说,CalenderSegue

  3. 在你的第二个视图控制器(要在其中传递),你需要有精确的类型,你是从第一个传递数据的属性。在你的情况下,它是Int。因此,在你的第二个视图控制器声明一个属性:

    var totalCalendarios = 0 
    
  4. 现在使用这个

    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?)方法。

但如果你只有一个赛格瑞,并且已经从 TableViewCellCalendarioViewController添加它,那么你可以使用

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,然后将它们添加回来。如果你不知道该怎么办,看到这个image

+0

是的,我已经更正了代码,它是totalCalendarios1,对不起,我会尝试你的代码,thx:D –

+0

我在segue的一段代码中添加了一个打印语句,它打印var totalCalendarios,并显示2(总的日历加载),然后在calendarioViewController的viewDidLoad()中打印totalCalendarios,它表示0.结果如下: Total Calendarios(segue):2 Total Calendarios(CalendarioViewController):0 –

+0

@MartinHernandezPerez是否在'prepare(for:sender:)'方法中正确使用'destino?.totalCalendarios = totalCalendarios'? – nayem

相关问题