【发布时间】: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
}
}
【问题讨论】:
-
如果您使用的是
Storyboard和IBOutlets,这个view.addSubview(mapView)的目的是什么? -
询问手动声明
IBOutlet是一个无稽之谈。 Interface Builder Outlets 的唯一目的是将它们与 Interface Builder 中的对象连接起来。
标签: ios swift swiftui storyboard uikit