Swiftui с делегированными функциями для mkmapview и uitextfield - PullRequest
4 голосов
/ 06 июня 2019

Я практикуюсь и читаю на SwiftUI, и я начинаю с создания простого приложения, в котором вы можете ввести местоположение в TextField Вид из swiftUI и затем ввести mkmapview в SwiftUI снова отправится в то место, которое я искал.Кажется, я не могу понять, как настроить эту функциональность с помощью моего mkmapview.

. Кроме того, я даже не могу найти способ отстранить клавиатуру от Textfield без выполнениянавигация или рендеринг нового вида или удаление вида.

Может кто-нибудь указать мне, как я могу отклонить мою клавиатуру?Я привык к resignFirstResponder() или didFinishEditing().
Кроме того, у кого-нибудь есть какие-либо предложения о том, как назначить функции для MKMapView из swiftUI, или я все это неправильно смотрю?

Я подумал, что в обработчике onCommit моего Textfield я бы вызвал функцию, которая могла бы передавать необходимые данные в 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)
        }
    }
}

* Редактировать Примечание. Мой код выше работает, он создает полноэкранный вид карты с текстовым полем, текстовое поле принимает текст и обновляет его состояние.Мой вопрос о том, как перейти от этого к получению функциональности к просмотру карты и скрыть мою чертову клавиатуру по возвращении

Ответы [ 4 ]

0 голосов
/ 02 июля 2019

Чтобы закрыть клавиатуру при нажатии кнопки возврата в TextField, вы можете использовать:

UIApplication.shared.keyWindow?.endEditing(true)

Вызов этого метода onCommit в TextField:

TextField($searchString, placeholder: Text("Search...")) {
     UIApplication.shared.keyWindow?.endEditing(true)
   }
   .font(.system(size: 23))
   .padding()
0 голосов
/ 09 июня 2019

Используйте координатор. Проверьте их пример Достопримечательности. Поиск делегата в учебнике. Я пишу на ходу, поэтому не могу опубликовать ссылку.

Я сделал это для UIImagePickerController

0 голосов
/ 11 июня 2019

Ладно, ребята,

Итак, из того, что я видел до сих пор, клавиатура будет игнорировать только некоторые изменения пользовательского интерфейса, но я нашел довольно элегантное решение!

Используя декларацию Binding для логического значения"didEnter", который я могу передавать между представлениями, когда пользователь нажимает клавишу возврата на клавиатуре, функция onCommit () вызывается в представлении TextField.Поэтому я добавил переключатель onCommit, который фактически переключает мое представление TextField на представление Text, которое отображает текст, имитирующий тот же внешний вид, затем после выполнения некоторой задачи я снова переключаю didEnter, который переключается обратно на TextField.

Stillвыглядит как обходной путь, но пока работает.

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)
            }
        }
    }
}
0 голосов
/ 06 июня 2019

Мне кажется, что вам нужно передать привязку в 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)
        }
    }
}
...