gpt4 book ai didi

swift - 应用委托(delegate)访问环境对象

转载 作者:行者123 更新时间:2023-12-03 09:30:04 25 4
gpt4 key购买 nike

我在一个需要在我的 View 之间传递的类中有一个变量(一个描述游戏的标签),我通过@EnvironmentObject 状态来完成。当更改该标签的函数(与变量在同一类中)被一个 View 调用时,该变量会在其他 View 中更新。但是,当触发通知时,AppDelegate 也会调用该函数。目前,我已经在 AppDelegate 中将包含标签的类声明为新实例,这不会导致 View /结构中的变量发生任何更改。

是否可以让 AppDeleagte 访问环境对象(例如,通过 AppDelegate().environmentobject(myClass),如果可以的话在哪里?)还是有更好的方法来做到这一点?

简化代码:

包含 playlistLabel 和更改播放列表和标签的函数的类

class MusicManager: NSObject, ObservableObject {

var playlistLabel: String = ""

func playPlaylistNow(chosenPlaylist: String?) {
playlistLabel = "Playlist: \(chosenPlaylist!)"
}

}

显示标签的主视图
struct HomeView: View {

@EnvironmentObject var musicManager: MusicManager

var body: some View {

Text(musicManager.playlistLabel)

}

}

应用委托(delegate)
class AppDelegate: UIResponder, UIApplicationDelegate, AVAudioPlayerDelegate {

var musicManager: MusicManager = MusicManager()

func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
var playlistName: String = ""
if let userInfo = notification.userInfo {
playlistName = userInfo["soundName"] as! String
}
musicPlayerManager.playPlaylist(chosenPlaylist: playlistName)

}
}

最佳答案

这是可能的方法。假设您的 AppDelegate有属性(property)

var musicManager: MusicManager?

在您的 SceneDelegate , 我想你在哪里创建 HomeView ,你可以有下面的代码
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

let musicManager = MusicManager()
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
addDelegate.musicManager = musicManager
}
let contentView = HomeView().environmentObject(musicManager)
...

因此两者 AppDelegateHomeView可以访问 MusicManager 的相同实例.

反之亦然
...
var musicManager: MusicManager?
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
musicManager = addDelegate.musicManager
}
let contentView = HomeView().environmentObject(musicManager ?? MusicManager())
...

取决于什么是可取的。

关于swift - 应用委托(delegate)访问环境对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59379898/

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