Estoy trabajando en una aplicación en la que necesitaba moverme entre los controladores de vista mucho tiempo, principalmente haciendo un bucle, pero ahora tengo que almacenar algunos datos (variables simples y matrices).

Actualmente los estoy almacenando en el delegado de la aplicación, pero no sé si es una gran idea. He buscado en línea pero no pude decir cuál es la mejor solución para mí.
Así es como lo tengo configurado: Appdelegate:

var aantalSpelers: Int!
var namenSpelers = [String]()

var youself = KaartenSpeler()
var player2 = KaartenSpeler()
var player3 = KaartenSpeler()
var player4 = KaartenSpeler()
var player5 = KaartenSpeler()
var player6 = KaartenSpeler()

var Vragen = [[0,0,0,0,0,5]]
var VragenOnbekend = [[6,0,0,0,0,0]]
var VragenInformatie = [[["Spelletjeskamer",""],["Keuken",""],["Garage",""],["Binnenplaats",""],["Zitkamer",""],["Slaapkamer",""],["Studeerkamer",""],["Eetkamer",""],["Badkamer",""]], [["De Wit",""],["Pimpel",""],["Blaauw van Draet",""],["Roodhart",""],["Groenewoud",""],["Van Geelen",""]], [["Loden pijp",""],["Pistool",""],["Engelse sleutel",""],["Dolk",""],["Touw",""],["Kandelaar",""]]]
var EersteKeerMainScreen = true

Y en la CV:

func Appdelegate() -> AppDelegate {
    return UIApplication.sharedApplication().delegate as! AppDelegate
}

let sections = ["Locaties","Personages","Wapens"]

var aantalSpelers: Int!
var namenSpelers = [String]()
var eersteKaarten = [[Int(),Int()]]

var youself: KaartenSpeler!
var player2: KaartenSpeler!
var player3: KaartenSpeler!
var player4: KaartenSpeler!
var player5: KaartenSpeler!
var player6: KaartenSpeler!

//vraag is: [numberVrager,numerGevraagde,numerLocatie,numerPersonage,numerWapen,0=lietgeenkaartzien - 1=locatie, - 2=personage - 3=wapen - 4=onbekend]
var Vragen = [[]]
var VragenOnbekend = [[]]
var VragenInformatie = []

var EersteKeerMainScreen = false

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    //Get information back from appdelegate
    aantalSpelers = Appdelegate().aantalSpelers
    namenSpelers = Appdelegate().namenSpelers

    youself = Appdelegate().youself
    player2 = Appdelegate().player2
    player3 = Appdelegate().player3
    player4 = Appdelegate().player4
    player5 = Appdelegate().player5
    player6 = Appdelegate().player6

    Vragen = Appdelegate().Vragen
    VragenOnbekend = Appdelegate().VragenOnbekend
    VragenInformatie = Appdelegate().VragenInformatie
    EersteKeerMainScreen = Appdelegate().EersteKeerMainScreen

¿Y es esta realmente una opción viable?

PD Perdón por mi mal ingles

1
Cing 26 ene. 2016 a las 01:55

2 respuestas

La mejor respuesta

El enfoque que usaría (puede que no sea el mejor) en este caso es pasar las variables con usted usando segues mediante el uso de self.performSegueWithIdentifier ("segueTitle", sender).

Luego, en un prepareForSegue puede manejar los objetos que mueve de este VC a otro VC.

E.g.

/*Global Variable is numbersArray*/
var numbersArray: [String] = []

Y cada vez que termine de escribir su lógica para el controlador de vista, use:

self.performSegueWithIdentifier("segueTitle", sender: self)

Ahora, para manejar lo que desea pasar al siguiente VC, agregue esto:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if (segue.identifier == "segueTitle") {
            // pass data to next view
            let destinationVC = segue.destinationViewController as! YourNextViewController
            destinationVC.numbersArray = self.numbersArray;

    }
}

Lo que debe tener en cuenta es que debe tener la misma variable global en el próximo VC, ya que puede ver que estamos asignando actual al siguiente en el ejemplo anterior. También asegúrese de que segue se cree y conecte a través de Storyboard y reemplace segueTitle con el título que se le asigna.

Actualización: p. Ej. TransferClass

class TranferClass {
   var numbersArray:[String] = []

}

Luego cree una instancia de esta clase y envíela al siguiente VC.Eg .:

En VC 1:

/*in global scope*/
var transferObject = TransferClass()

En el mismo VC, configure la matriz, por ejemplo:

self.transferObject.numbersArray[0] = "Hello"

Luego desencadena la segue: Luego desencadena el segue:

self.performSegueWithIdentifier(...)

Luego maneja el pase:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
            if (segue.identifier == "segueTitle") {
                // pass data to next view
                let destinationVC = segue.destinationViewController as! YourNextViewController
                destinationVC.transferObject = self.transferObject;

        }
    }
2
ksa_coder 25 ene. 2016 a las 23:07

Su pensamiento inicial es que probablemente no debería almacenarlos en AppDelegate. Recomiendo crear una nueva clase o una estructura que pueda contener estos valores.

Pero la otra cosa que noté es que ya tienes una clase separada para KaartenSpeler por lo que definitivamente debes estar atento a los ciclos de retención y asegurarte de que estas clases no tengan fuertes referencias entre sí.

0
jasonnoahchoi 25 ene. 2016 a las 23:05