8

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

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

谁能指出我如何关闭我的键盘?我习惯了resignFirstResponder()didFinishEditing()
另外,是否有人对如何为MKMapViewfrom分配功能有任何建议,swiftUI或者我认为这一切都错了?

我想在我的 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 的功能并在返回时隐藏我该死的键盘来继续前进

4

4 回答 4

3

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

UIApplication.shared.keyWindow?.endEditing(true)

在 TextField 的 onCommit 方法上调用它:

TextField($searchString, placeholder: Text("Search...")) {
     UIApplication.shared.keyWindow?.endEditing(true)
   }
   .font(.system(size: 23))
   .padding()
于 2019-07-02T03:01:54.550 回答
0

好吧,伙计们,

所以从我目前看到的情况来看,键盘只会在一些 ui 更改时消失,但我找到了一个非常优雅的解决方案!

通过使用我可以在视图之间传递的布尔“didEnter”的绑定声明,当用户点击键盘上的返回时,在 TextField 视图中调用 onCommit() 函数。所以我为 onCommit 添加了一个切换开关,它实际上将我的 TextField 视图切换到一个 Text 视图,该视图显示模拟相同外观的文本,然后在完成某些任务后,我再次切换 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)
            }
        }
    }
}
于 2019-06-11T16:34:08.357 回答
0

使用协调员。查看他们的地标示例。在教程中搜索委托。我正在写,所以不能发布链接。

我为 UIImagePickerController 做了这个

于 2019-06-09T20:18:07.410 回答
0

我的直觉是你需要将绑定传递给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)
        }
    }
}
于 2019-06-06T08:07:51.750 回答