带有 mkmapview 和 uitextfield 委托函数的 Swiftui
Posted
技术标签:
【中文标题】带有 mkmapview 和 uitextfield 委托函数的 Swiftui【英文标题】:Swiftui with delegate functions for mkmapview and uitextfield 【发布时间】:2019-06-06 04:16:42 【问题描述】:我正在练习和阅读SwiftUI
,我开始制作一个简单的应用程序,您可以在其中将位置输入TextField
查看swiftUI
,然后在@ 中输入mkmapview
987654325@ 将再次转到我搜索的那个位置。我似乎一辈子都无法掌握如何使用我的mkmapview
设置此功能。
此外,我什至找不到在不进行导航或呈现新视图或删除视图的情况下从Textfield
关闭键盘的方法。
谁能指出我如何关闭我的键盘?我习惯了resignFirstResponder()
或didFinishEditing()
。
另外,是否有人对如何从swiftUI
为MKMapView
分配功能有任何建议,还是我看错了?
我想在我的 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 的功能并在返回时隐藏我该死的键盘来继续前进
【问题讨论】:
我认为你需要让SearchField
绑定到MainView
中的文本属性,但我还没有设法让它工作。编辑:在下面发布建议的方法。
【参考方案1】:
要在 TextField 中按下返回按钮时关闭键盘,您可以使用:
UIApplication.shared.keyWindow?.endEditing(true)
在 TextField 的 onCommit 方法上调用它:
TextField($searchString, placeholder: Text("Search..."))
UIApplication.shared.keyWindow?.endEditing(true)
.font(.system(size: 23))
.padding()
【讨论】:
【参考方案2】:我的直觉是您需要像这样将绑定传递给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)
【讨论】:
所以两种方式都有效,作为绑定或我实现的方式 但这并不能解决我无法在 swiftui 中向 mkmapview 添加功能或无法处理我的键盘的主要问题【参考方案3】:使用协调员。查看他们的地标示例。在教程中搜索委托。我正在写,所以不能发布链接。
我为 UIImagePickerController 做了这个
【讨论】:
这个? developer.apple.com/tutorials/swiftui/interfacing-with-uikit 你说得对,我最终使用协调器来获得我想要的 mapkit 行为,这更有意义。此外,我确信我们正处于一个阶段,我们不能指望 SwiftUI 能够简单地完成它所宣传的所有事情,而且还很早。 @alexbuga,你的UIImagePickerController
的代码在某个地方吗?我可以让所有工作除了它不会在第一次被解雇后出现第二次时间。任何机会你有什么工作? (我仍然不相信这只是一个 beta 1 错误。【参考方案4】:
好吧,伙计们,
所以从我目前看到的情况来看,键盘只会在一些 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)
【讨论】:
以上是关于带有 mkmapview 和 uitextfield 委托函数的 Swiftui的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iPhone 应用程序内的 MKMapView 中显示和连接多个位置与带有注释的路线?