gpt4 book ai didi

ios - 如何通过 SwiftUI 按钮在 UIViewController 中执行函数?

转载 作者:行者123 更新时间:2023-11-29 13:52:06 30 4
gpt4 key购买 nike

在下面的代码中,我试图找出如何使用 SwiftUI 按钮执行 savePhoto 函数。这实际上是我试图解决的问题的简化版本,但仍然无法弄清楚。我在 ContentView 中创建的按钮是我想象的解决问题的方式,但由于 SwiftUI 结构,我似乎找不到解决方法。

这是我的 SwiftUI View :

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 之间创建一个绑定(bind)让我们用代码解释一下:首先,您需要在 AnotherControllerView

中声明一个用 @Binding 注释的新变量

它会是这样的:

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 中,我们在那里实现逻辑

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")
}
}

如果你想捕捉图像,让我告诉你我是如何实现的:

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
}
}

}

在正文中我只是调用:

CaptureImageView(isShown: $showCaptureImageView, image: $imageCaptured, sourceType: importSourceType)

关于ios - 如何通过 SwiftUI 按钮在 UIViewController 中执行函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59143053/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com