Cambios de variables inicializados globalmente a 'nil' en Swift UIView XIB?

Tengo una variable inicializada globalmente dentro de una class UIView .

La variable es statusLabel como cadena. He asignado un valor para statusLabel en el método de delegado didSelectRow de didSelectRow . Ahí estoy obteniendo el valor de la cadena. Sin embargo, cuando el delegado termina el valor de los cambios de cadena a nil

Es igual para todas las demás variables inicializadas globalmente. ¿Cuál podría ser la razón?

Gracias por adelantado

 class CustomPickerMenu: UIView,UIPickerViewDataSource,UIPickerViewDelegate { var statusLabel = String() var pickerArray = [String]() requinetworking init?(coder aDecoder: NSCoder) { pickerArray = ["None","Connections","All"] super.init(coder: aDecoder) print("Awake with coder") } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if(row == 0) { statusLabel = pickerArray[row] } if(row == 1) { statusLabel = pickerArray[row] } if(row == 2) { statusLabel = pickerArray[row] } print("statusLabel : " + statusLabel) } @IBAction func saveStatus(_ sender: Any) { delegate?.statusChange(controller: self, text:statusLabel) self.delegate?.showNavigationController(controller: self) print("statusLabel : " + statusLabel) } 

aquí está el resultado para statusLabel durante didselectrow delegate (1er 3 salidas) y save estado (último resultado) introduzca la descripción de la imagen aquí

Haga estas comprobaciones y vea si su código sigue igual. delegate es una variable débil.

  • Como delegado es opcional, asegúrese de no obligar a desenvolverlo. Uso en lugar de .

  • Asegúrese de que el Protocolo esté siendo implementado por la class a la que apunta este delegado.

  • Asegúrese de que la variable de delegate se asigne a self en la class implementada.

Una demostración de patio de juegos sería.

 class CustomPickerMenu { var statusLabel = String() var pickerArray = [String]() weak var delegate:Sample? func call() { pickerArray = ["One", "Two"] print(pickerArray) } func pick() { statusLabel = pickerArray[0] print(statusLabel) } @IBAction func saveStatus(_ sender: Any) { print(statusLabel) self.delegate?.doSomething(data: statusLabel) print(statusLabel) } } class Apply: Sample { func test() { let picker = CustomPickerMenu() picker.call() picker.pick() picker.delegate = self picker.saveStatus(self) } func doSomething(data: String) { print(data) } } let apply = Apply() apply.test() 

Encontré la solución, más que eso fue un error. la class que usé "CustomPickerMenu" se llamó más de una vez. Durante init (frame) e init (decodificador). Esa es la razón por la que el valor de la cadena se asigna inicialmente durante la primera llamada y cambia a cero durante la segunda llamada.

Inicialmente conecté a los delegates a xib a través del guión gráfico, luego llamé a la class xib desde un controller de vista, que eventualmente llamará al xib init (marco). Escribí el código para cargar el xib en su init (frame). Como ya he conectado el xib con el storyboard, xib también lo llamará método init (codificador).

así que lo que hice fue eliminar a los delegates del storyboard y llamar "self.pickerView.delegate" y "self.pickerView.dataSource" en su init (frame), eventualmente el método init (coder) deja de llamar.

Ahora, el valor de la cadena no cambia.