fondo color cambiar ios iphone swift swift2 swift3

ios - color - No se puede acceder a la variable presente en clase desde el controlador



ionic sass (3)

import UIKit class ViewController: UIViewController { var icnNum : Int64 = 0 let stopHandler = { (action:UIAlertAction!) -> Void in let num = icnNum } func showAlert( userStatus: String ) { let alert = UIAlertController(title: "", message: "", preferredStyle: .alert) alert.title = "What you want to do?" alert.addAction(UIAlertAction(title: "Stop", style: .default, handler: stopHandler)) } }

No sé cómo acceder a ese icnNum desde el controlador. Estoy recibiendo un error de seguimiento. Sé que no puedo acceder a esa variable directamente, pero cuál es el camino.

El miembro de instancia ''icnNum'' no se puede usar en el tipo ''ViewController''


Defina el cierre de stopHandler dentro de la función showAlert() y debería funcionar.

class ViewController: UIViewController { var icnNum : Int64 = 0 func showAlert( userStatus: String ) { let stopHandler = { (action:UIAlertAction!) -> Void in let num = self.icnNum } let alert = UIAlertController(title: "", message: "", preferredStyle: .Alert) alert.title = "What you want to do?" alert.addAction(UIAlertAction(title: "Stop", style: .Default, handler: stopHandler)) } } }

El compilador te obligará a escribir self.icnNum lugar de icnNum para que sea obvio que el cierre tendrá una referencia a sí mismo.

Almacenar el cierre de stopHandler como una variable, como lo hizo en su ejemplo, crearía una referencia cíclica. Su instancia de ViewController contiene una fuerte referencia al cierre de stopHandler, el cierre contiene una fuerte referencia a self (que es un puntero a su instancia de ViewController).

Actualice si desea reutilizar el stopHandler

class ViewController: UIViewController { var icnNum : Int64 = 0 var stopHandler: ((action:UIAlertAction!) -> Void)? override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) self.stopHandler = { [weak self] (action:UIAlertAction!) -> Void in let num = self?.icnNum } } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func showAlert( userStatus: String ) { let alert = UIAlertController(title: "", message: "", preferredStyle: .Alert) alert.title = "What you want to do?" alert.addAction(UIAlertAction(title: "Stop", style: .Default, handler: stopHandler)) } }

Observe el [weak self] al establecer el cierre de stopHandler. Esto evitará que el cierre mantenga una fuerte referencia a sí mismo y evitará la referencia cíclica descrita anteriormente.

Más detalles en: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-ID57


Puede pasar un método como el controlador. Esto evita la necesidad de tener un cierre desnudo flotando alrededor.

class ViewController: UIViewController { var icnNum : Int64 = 0 func stopHandler(_ action: UIAlertAction) { let num = icnNum } func showAlert(userStatus: String) { let alert = UIAlertController(title: "", message: "", preferredStyle: .alert) alert.title = "What you want to do?" alert.addAction(UIAlertAction(title: "Stop", style: .default, handler: stopHandler)) } }

ACTUALIZAR

El comportamiento esperado para manejadores como este es usar un cierre que puede incluir el contexto local.

func showAlert(userStatus: String) { let localContext = "Local information" // … alert.addAction(UIAlertAction(title: "Stop", style: .default) { action in if localContext == "Local information" { // Do Something } }) }

Sin embargo, no tienes un contexto local. El contexto en el que está trabajando está contenido en la instancia del objeto.

func showAlert(userStatus: String) { // … alert.addAction(UIAlertAction(title: "Stop", style: .default, handler: stopHandler)) }

Debido a que no tiene nada local usado en su controlador, no necesita un cierre.

func stopHandler(_ action: UIAlertAction) { let num = icnNum }

hará lo mismo que el manejador de cierre, pero le da el contexto de la instancia del objeto.


puedes escribir tu cerrador de esta manera

let stopHandler = { (icnNum: Int64 ,action:UIAlertAction!) -> Void in let num = icnNum }

mientras llamas esto más cerca de esta manera

alert.addAction(UIAlertAction(title: "Stop", style: .default, handler: stopHandler(self.icnNum, UIAlertAction!)))