gpt4 book ai didi

ios - 如何从swiftui View 调用uikit viewcontroller方法

转载 作者:行者123 更新时间:2023-12-01 16:11:51 24 4
gpt4 key购买 nike

我已经到处寻找这个问题的答案,但似乎找不到。如何从 swiftUI 调用 viewController 方法(例如单击按钮)?
我有一个看起来像这样的 View Controller :

import Player

class PlayerViewController: UIViewController {
var player = Player()
func play() {
self.player.play()
}
}
我有一个看起来像这样的包装器:
import SwiftUI
import AVFoundation

struct ProjectEditorPlayerBridge: UIViewControllerRepresentable {

func makeUIViewController(context: Context) -> PlayerViewController {
let player = PlayerViewController()
return player
}

func updateUIViewController(_ uiViewController: PlayerViewController, context: Context) {
}

typealias UIViewControllerType = PlayerViewController
}
我希望能够在 swiftUI 中使用按钮操作并调用 viewController play方法一次。我已经看到建议在包装器上设置状态/绑定(bind)并在 updateUIViewController 中调用该方法的答案,但是当我这样做时,我看到它被多次调用,而不仅仅是一次。

最佳答案

这是可能的基于协议(protocol)/配置器的方法,它允许直接使用从代码简单性和可读性来看更合适的操作。

protocol Player { // use protocol to hide implementation
func play()
}

class PlayerViewController: UIViewController, Player {
var player = Player()
func play() {
self.player.play()
}
}

struct ProjectEditorPlayerBridge: UIViewControllerRepresentable {
var configurator: ((Player) -> Void)? // callback

func makeUIViewController(context: Context) -> PlayerViewController {
let player = PlayerViewController()

// callback to provide active component to caller
configurator?(player)

return player
}

func updateUIViewController(_ uiViewController: PlayerViewController, context: Context) {
}

typealias UIViewControllerType = PlayerViewController
}

struct DemoPlayerView: View {
@State private var player: Player? // always have current player

var body: some View {
VStack {
ProjectEditorPlayerBridge { self.player = $0 } // << here !!

// use player action directly !!
Button("Play", action: player?.play ?? {})
}
}
}

关于ios - 如何从swiftui View 调用uikit viewcontroller方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62504435/

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