如何通过 SwiftUI 按钮在 UIViewController 中执行函数? [英] How to execute a function in a UIViewController through a SwiftUI Button?
问题描述
在下面的代码中,我试图弄清楚如何使用 SwiftUI
按钮执行 savePhoto
函数.这实际上是我试图解决的问题的简化版本,但仍然无法弄清楚.我在 ContentView
中创建的按钮是我想象中解决问题的方式,但由于 SwiftUI 结构,我似乎无法找到解决方法.
In the code below, I am trying to figure out how to execute the savePhoto
function with a SwiftUI
button. This is actually the simplified version of the problem I am trying to solve, but still can't figure this out. The button I created in the ContentView
is how I would imagine to solve the problem, but because of the SwiftUI structs, I can't seem to find a way around it.
这是我的 SwiftUI 视图:
struct ContentView: View {
var body: some View {
ZStack{
AnotherControllerView()
Button(action: { AnotherControllerView.savePhoto() }){
Text("Save Photo")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
还有我集成的 UIViewController:
import Foundation
import SwiftUI
import UIKit
struct AnotherControllerView : UIViewControllerRepresentable {
typealias UIViewControllerType = AnotherController
func makeCoordinator() -> AnotherControllerView.Coordinator {
Coordinator(self)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<AnotherControllerView>) -> AnotherController {
return AnotherController()
}
func updateUIViewController(_ uiViewController: AnotherController, context: UIViewControllerRepresentableContext<AnotherControllerView>) {
}
class Coordinator : NSObject {
var parent : AnotherControllerView
init(_ viewController : AnotherControllerView){
self.parent = viewController
}
}
}
class AnotherController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.blue
}
func savePhoto(){
let alert = UIAlertController(title: "Save Photo to Camera Roll", message: "Would you like to save your drawing to the camera roll?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
alert.addAction(UIAlertAction(title: "Save", style: .default, handler: someHandler))
self.present(alert, animated: true)
}
func someHandler(alert: UIAlertAction!) {
print("Handler executed")
}
}
推荐答案
你好控制 UIViewController 我们需要在 View 和 UIViewControllerRepresentable 之间创建一个绑定让我们用代码解释一下:首先,您需要在 AnotherControllerView
Hello to control the UIViewController we need to create a bind between the View and UIViewControllerRepresentable
let explain it in code:
first you need to declare a new variable annotated with @Binding
inside the AnotherControllerView
它会是这样的:
struct AnotherControllerView : UIViewControllerRepresentable {
@Binding var isShown: Bool
typealias UIViewControllerType = AnotherController
func makeCoordinator() -> AnotherControllerView.Coordinator {
Coordinator()
}
func makeUIViewController(context: UIViewControllerRepresentableContext<AnotherControllerView>) -> AnotherController {
return AnotherController(isShown: $isShown)
}
func updateUIViewController(_ controller: AnotherController, context: UIViewControllerRepresentableContext<AnotherControllerView>) {
if(self.isShown){
controller.savePhoto()
}
}
class Coordinator : NSObject {
}
}
因此在 updateUIViewController
中我们实现了逻辑
so for that in the updateUIViewController
we implement the logic there
class AnotherController : UIViewController {
@Binding var isShown: Bool
init(isShown: Binding<Bool>) {
_isShown = isShown
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.blue
}
func savePhoto(){
let alert = UIAlertController(title: "Save Photo to Camera Roll", message: "Would you like to save your drawing to the camera roll?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: cancelAlert))
alert.addAction(UIAlertAction(title: "Save", style: .default, handler: someHandler))
self.present(alert, animated: true)
}
func cancelAlert(alert: UIAlertAction!) {
self.isShown = false
}
func someHandler(alert: UIAlertAction!) {
print("Handler executed")
}
}
如果您想捕捉图像,让我向您展示我是如何实现的:
and if you're trying to capture an image let me show you how I implemented this:
struct CaptureImageView {
@Binding var isShown: Bool
@Binding var image: Image?
var sourceType: UIImagePickerController.SourceType
func makeCoordinator() -> Coordinator {
return Coordinator(isShown: $isShown, image: $image)
}
}
extension CaptureImageView: UIViewControllerRepresentable {
func makeUIViewController(context: UIViewControllerRepresentableContext<CaptureImageView>) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
picker.sourceType = sourceType
return picker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<CaptureImageView>) {
}
class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@Binding var isCoordindatorShown: Bool
@Binding var imageInCoordinator: Image?
init(isShown: Binding<Bool>, image: Binding<Image?>) {
_isCoordindatorShown = isShown
_imageInCoordinator = image
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let unwrapImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else {return}
imageInCoordinator = Image(uiImage: unwrapImage)
isCoordindatorShown = false
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
isCoordindatorShown = false
}
}
}
在我刚刚调用的正文中:
and in the body I just call :
CaptureImageView(isShown: $showCaptureImageView, image: $imageCaptured, sourceType: importSourceType)
这篇关于如何通过 SwiftUI 按钮在 UIViewController 中执行函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!