具有 mkmapview 和 uitextfield 委托函数的 Swiftui

Swiftui with delegate functions for mkmapview and uitextfield

我正在练习和阅读 SwiftUI,我开始制作一个简单的应用程序,您可以在其中将位置输入 TextField 来自 swiftUI 的视图,然后在 SwiftUI 中再次输入 mkmapview 将转到我搜索的那个位置。我似乎一辈子都无法掌握如何使用我的 mkmapview.

设置此功能

此外,我什至找不到在不进行导航、呈现新视图或删除视图的情况下从 Textfield 关闭键盘的方法。

谁能告诉我如何关闭键盘?我习惯了 resignFirstResponder()didFinishEditing().
另外,有人对如何从 swiftUIMKMapView 分配功能有什么建议吗?还是我看错了?

我想在我的 Textfield 的 onCommit 处理程序中我会调用一个函数,该函数可以将必要的数据传递给 MapView 并处理它,但我还没有找到一个好的方法来做到这一点。

struct MainView : View {

    @State var text: String = ""

    var body: some View {
        VStack {
            MapView()
                .frame(height: UIScreen.main.bounds.height)
                .offset(y: 50)
                //.edgesIgnoringSafeArea(.top)

            SearchField(text: "")
                .offset(y: -(UIScreen.main.bounds.height) + 60)
                .padding()
        }
    }
}
struct MapView : UIViewRepresentable {
    func makeUIView(context: Context) -> MKMapView {
        MKMapView(frame: .zero)
    }

    func updateUIView(_ view: MKMapView, context: Context) {
        let coordinate = CLLocationCoordinate2D(
            latitude: 34.011286, longitude: -116.166868)
        let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
        let region = MKCoordinateRegion(center: coordinate, span: span)
        view.setRegion(region, animated: true)
    }
}
struct SearchField : View {
    @State var text: String
    @State var showDetails: Bool = false

    var body: some View {
        VStack {
            RoundedRectangle(cornerRadius: 30).frame(width: 300, height: 40)
                .foregroundColor(.white)
                .offset(y: 55)
            TextField($text, placeholder: Text("City, State, or Address"), onEditingChanged: { body in
                print(body)

            }, onCommit: {
                print(self.text)
            })
                .padding()
                .offset(x: 50)
        }
    }
}

*编辑注意:我上面的代码有效,它将构建一个全屏地图视图,上面有一个文本字段,文本字段接受文本并更新它的状态。我的问题是关于通过获取 mapview 的功能并将我该死的键盘隐藏在 return

上来向前推进

我的直觉是你需要像这样将绑定传递到 SearchField

struct MainView : View {

    @State var text: String = ""

    var body: some View {
        VStack {
            MapView()
                .frame(height: UIScreen.main.bounds.height)
                .offset(y: 50)
            //.edgesIgnoringSafeArea(.top)

            SearchField(text: $text)
                .offset(y: -(UIScreen.main.bounds.height) + 60)
                .padding()
        }
    }
}

struct MapView : UIViewRepresentable {
    func makeUIView(context: Context) -> MKMapView {
        MKMapView(frame: .zero)
    }

    func updateUIView(_ view: MKMapView, context: Context) {
        let coordinate = CLLocationCoordinate2D(
            latitude: 34.011286, longitude: -116.166868)
        let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
        let region = MKCoordinateRegion(center: coordinate, span: span)
        view.setRegion(region, animated: true)
    }
}

struct SearchField : View {
    @State var text: Binding<String>

    var body: some View {
        VStack {
            RoundedRectangle(cornerRadius: 30).frame(width: 300, height: 40)
                .foregroundColor(.white)
                .offset(y: 55)
            TextField(text, placeholder: Text("City, State, or Address"), onEditingChanged: { body in
                print(self.text)

            }, onCommit: {
                print(self.text)
            })
                .padding()
                .offset(x: 50)
        }
    }
}

使用协调器。查看他们的 Landmarks 示例。在教程中搜索委托。我在路上写作,所以不能 post link。

我为 UIImagePickerController 做了这个

好的,

因此,据我目前所见,键盘只会在某些 ui 更改时关闭,但我找到了一个非常优雅的解决方案!

通过对我可以在视图之间传递的布尔值 "didEnter" 使用绑定声明,当用户在键盘上点击 return 时,在 TextField 视图中调用 onCommit() 函数。因此,我为 onCommit 添加了一个切换开关,它实际上将我的 TextField 视图切换到显示模拟相同外观的文本的文本视图,然后在完成某些任务后,我再次切换 didEnter 切换回 TextField。

仍然感觉像是一种解决方法,但目前有效。

struct InputView : View {
    @Binding var text:          String
    @Binding var didEnter:      Bool
    @State   var searchType:    SearchType

    var body: some View {
        ZStack{
            RoundedRectangle(cornerRadius: 15).frame(width: 310, height: 100)
                .foregroundColor(.secondary)
                .offset(y: -20)
            ZStack{
                RoundedRectangle(cornerRadius: 30).frame(width: 290, height: 40)
                    .foregroundColor(.white)
                if(!didEnter){
                    TextField($text, placeholder: Text("City, State, Address")) {
                        print(self.text)
                        self.didEnter.toggle()
                    }
                        .frame(width: 220, height: 40, alignment: .leading)
                        .offset(x: -20)
                }
                else{
                    Text(self.text).frame(width: 220, height: 40, alignment: .leading)
                        .offset(x: -20)
                }
                Text("Select Location:").bold().fontWeight(.medium)
                    .offset(y: -40)
                    .foregroundColor(.white)
            }
        }
    }
}

要在 TextField 中按下 return 按钮时关闭键盘,您可以使用:

UIApplication.shared.keyWindow?.endEditing(true)

在 TextField 的 onCommit 方法上调用它:

TextField($searchString, placeholder: Text("Search...")) {
     UIApplication.shared.keyWindow?.endEditing(true)
   }
   .font(.system(size: 23))
   .padding()