【问题标题】:Swift IBOutlet is nil but it is connected storyboardSwift IBOutlet 是 nil 但它是连接的故事板
【发布时间】:2023-04-04 14:13:01
【问题描述】:

我正在使用 SwiftUI 开发 iOS 应用程序,但我需要使用 UIKit 开发一些 SwiftUI 不支持的功能。 所以,我在 SwiftUI 中开发 UIKit,但是 UIKit 的 IBOutlet 是 nil 所以我不能更新 UIKit 的值。有没有办法手动声明 IBOutlet?

class StoreDetailViewController : UIViewController, CLLocationManagerDelegate, updateValue{
    @IBOutlet weak var mapView: NMFMapView!
    var lat : Double = 0.0
    var lon : Double = 0.0
    let marker = NMFMarker()

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        
        view.addSubview(mapView)
    }
    
    @IBSegueAction func loadSwiftUI(_ coder: NSCoder) -> UIViewController? {
        return UIHostingController(coder: coder, rootView: storeDetail())
    }
    
    func removeMarker(){
        marker.mapView = nil
    }
    
    func setMarker(lat: Double, lon: Double){
        print("setting marker, ", lat, lon)
        marker.position = NMGLatLng(lat: lat, lng: lon)
        marker.mapView = self.mapView

    }
}

struct loadViewController: UIViewControllerRepresentable{
    var delegate : updateValue?

    func updateUIViewController(_ uiViewController: StoreDetailViewController, context: Context) {

    }
    
    func setPosition(latitude: String, longitude: String){
        print("position : ", latitude, longitude)
        self.delegate?.setMarker(lat: Double(latitude)!, lon: Double(longitude)!)
        StoreDetailViewController().setMarker(lat: Double(latitude)!, lon: Double(longitude)!)
        delegate?.setMarker(lat: Double(latitude)!, lon: Double(longitude)!)
    }
    
    typealias UIViewControllerType = StoreDetailViewController

    func makeUIViewController(context: UIViewControllerRepresentableContext<loadViewController>) -> UIViewControllerType {
        UIStoryboard(name: "storeDetail", bundle: nil).instantiateViewController(identifier: "Store Detail View Controller") as! StoreDetailViewController
    }
}

【问题讨论】:

  • 如果您使用的是StoryboardIBOutlets,这个view.addSubview(mapView) 的目的是什么?
  • 询问手动声明IBOutlet 是一个无稽之谈。 Interface Builder Outlets 的唯一目的是将它们与 Interface Builder 中的对象连接起来。

标签: ios swift swiftui storyboard uikit


【解决方案1】:

makeUIViewController 中实例化您的视图控制器时,出口尚未初始化。

您想要进行的任何更新都应该使用updateUIViewController

struct loadViewController: UIViewControllerRepresentable{
    typealias UIViewControllerType = StoreDetailViewController

    var lat: Double
    var lon: Double

    func makeUIViewController(context: UIViewControllerRepresentableContext<loadViewController>) -> UIViewControllerType {
        UIStoryboard(name: "storeDetail", bundle: nil).instantiateViewController(identifier: "Store Detail View Controller") as! StoreDetailViewController
    }

    func updateUIViewController(_ uiViewController: StoreDetailViewController, context: Context) {
        uiViewController.setMarker(lat: lat, lon: lon)
    }
}

来自您的 SwiftUI 代码:

loadViewController(lat: 0.0, lon: 0.0)

【讨论】:

    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 2017-04-17
    • 2017-02-08
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    相关资源
    最近更新 更多