Отправить действие tapAction из SwiftUI для кнопки в функцию UIView - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь найти способ вызвать действие, которое вызовет функцию в моем UIView, когда кнопка будет нажата внутри swiftUI.

Вот мои настройки:

foo()(UIView) необходимо запустить, когда Button(SwiftUI) будет нажата

Мой пользовательский класс UIView, использующий фреймворки AVFoundation

class SomeView: UIView {

    func foo() {}
}

Чтобы использовать мой UIView внутри swiftUI, я должен обернуть его в UIViewRepresentable

struct SomeViewRepresentable: UIViewRepresentable {

    func makeUIView(context: Context) -> CaptureView {
        SomeView()
    }

    func updateUIView(_ uiView: CaptureView, context: Context) {        
    }
}

SwiftUI Просмотр, в котором размещен мой UIView ()

struct ContentView : View {

    var body: some View {
        VStack(alignment: .center, spacing: 24) {
            SomeViewRepresentable()
                .background(Color.gray)
            HStack {
                Button(action: {
                    print("SwiftUI: Button tapped")
                   // Call func in SomeView()
                }) {
                    Text("Tap Here")
                }
            }
        }
    }
}

1 Ответ

3 голосов
/ 13 июня 2019

Вы можете сохранить экземпляр вашего пользовательского UIView в представимой структуре (SomeViewRepresentable здесь) и вызывать его методы для действий касания:

struct SomeViewRepresentable: UIViewRepresentable {

  let someView = SomeView() // add this instance

  func makeUIView(context: Context) -> SomeView { // changed your CaptureView to SomeView to make it compile
    someView
  }

  func updateUIView(_ uiView: SomeView, context: Context) {

  }

  func callFoo() {
    someView.foo()
  }
}

И ваше тело представления будет выглядеть так:

  let someView = SomeViewRepresentable()

  var body: some View {
    VStack(alignment: .center, spacing: 24) {
      someView
        .background(Color.gray)
      HStack {
        Button(action: {
          print("SwiftUI: Button tapped")
          // Call func in SomeView()
          self.someView.callFoo()
        }) {
          Text("Tap Here")
        }
      }
    }
  }

Чтобы проверить это, я добавил распечатку к методу foo():

class SomeView: UIView {

  func foo() {
    print("foo called!")
  }
}

Теперь, нажав на вашу кнопку, вы вызовете foo(), и будет показан оператор печати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...