es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Llama a la función UIKIT desde SWIFTUI.

Tengo una función de Storyboard UIKIT llamada getAcctBalance(). En mi archivo de UIKIT muestro un UIHostingController para cargar una vista SWIFTUI. En la vista SWIFTUI quiero llamar a mi función getAcctBalance().

SWIFTUI:

import SwiftUI
import SWXMLHash

struct UserDashboard: View {

    @ObservedObject var userModel: UserDashboardModel

    Button(action: {
       UserDashboardHostVC.getAcctBalance() // Esta llamada a la función no está funcionando
    }){
       Text("Cargar balance")
    }

    Text(userModel.totalBalance) // por defecto es 0.0 y cuando se presiona el botón debe devolver 599

}

UIKIT:

import UIKit

class UserDashboardModel: ObservableObject {
    @Published var totalBalance = 0.0
}

class UserDashboardHostVC: UIViewController {

    var userModel = UserDashboardModel()

    override func viewDidLoad() {
        super.viewDidLoad()

        let controller = UIHostingController(rootView: UserDashboard(userModel: self.userModel))
        controller.view.translatesAutoresizingMaskIntoConstraints = false
        self.addChild(controller)
        self.view.addSubview(controller.view)
        controller.didMove(toParent: self)

    }

    func getAcctBalance {
        userModel.totalBalance = 599
    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para llamar a la función getAcctBalance() desde la vista UserDashboard, necesitarías crear una instancia de UserDashboardHostVC y llamar a la función desde allí.

    Primero, crea una referencia a UserDashboardHostVC en la vista UserDashboard, así:

    struct UserDashboard: View {
    
        @ObservedObject var userModel: UserDashboardModel
        var hostVC: UserDashboardHostVC  // añade esta línea
    
        // ...
    }
    

    Luego, modifica UserDashboardHostVC para pasar sí mismo como parámetro a la vista UserDashboard:

    class UserDashboardHostVC: UIViewController {
    
        var userModel = UserDashboardModel()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let dashboardView = UserDashboard(userModel: self.userModel, hostVC: self) // pasa self como hostVC
            let controller = UIHostingController(rootView: dashboardView)
    
            // ...
        }
    
        func getAcctBalance() {
            userModel.totalBalance = 599
        }
    }
    

    Finalmente, en la vista UserDashboard, llama a la función getAcctBalance() en la referencia hostVC:

    struct UserDashboard: View {
    
        @ObservedObject var userModel: UserDashboardModel
        var hostVC: UserDashboardHostVC
    
        Button(action: {
           hostVC.getAcctBalance() // llamar a la función en hostVC
        }){
           Text("Cargar saldo")
        }
    
        // ...
    }
    

    Ten en cuenta que también necesitas agregar paréntesis a la declaración de la función getAcctBalance para corregir un error de sintaxis.

Comments are closed.