You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中歌曲切换时无法自动更新歌曲标题变量的求助

解决SwiftUI实时显示当前播放歌曲标题的问题

核心问题排查

你的代码无法实时更新UI,主要是两个关键错误:

  1. 你试图修改的全局songTitle不属于ObservableObject的可观察属性,SwiftUI无法感知它的变化,自然不会刷新Text组件。
  2. MusicMonitor类内没有定义用于响应式更新的属性,即使通知触发了updateCurrentSong(),也无法把变化传递给UI。

修正后的完整实现

1. 重构MusicMonitor类

把歌曲标题改成类内的@Published属性,用Combine替代旧的NotificationCenter观察者写法(更符合SwiftUI响应式风格):

import MusicKit
import Combine

class MusicMonitor: ObservableObject {
    // 用@Published标记,让SwiftUI能监听变化
    @Published var songTitle = "No song playing"
    private let player = MPMusicPlayerController.systemMusicPlayer
    private var cancellables = Set<AnyCancellable>()
    
    init() {
        // 监听歌曲切换通知
        NotificationCenter.default.publisher(for: .MPMusicPlayerControllerNowPlayingItemDidChange, object: player)
            .receive(on: DispatchQueue.main)
            .sink { [weak self] _ in
                self?.updateCurrentSong()
            }
            .store(in: &cancellables)
        
        // 开启播放通知生成
        player.beginGeneratingPlaybackNotifications()
        // 初始化获取当前播放歌曲
        updateCurrentSong()
    }
    
    private func updateCurrentSong() {
        songTitle = player.nowPlayingItem?.title ?? "No song playing"
    }
    
    deinit {
        player.endGeneratingPlaybackNotifications()
    }
}

2. 在SwiftUI视图中使用

通过@StateObject创建MusicMonitor实例,绑定到Text组件:

struct ContentView: View {
    @StateObject private var musicMonitor = MusicMonitor()
    
    var body: some View {
        Text(musicMonitor.songTitle)
            .padding()
    }
}

必要配置与补充说明

  • 权限设置:必须在Info.plist中添加NSAppleMusicUsageDescription键,填写应用访问音乐库的原因(比如"需要获取当前播放的歌曲信息"),否则无法读取播放状态。
  • 通知补全方案:部分场景下(比如从控制中心手动切歌),系统通知可能延迟或不触发,可以添加一个定时任务作为补充(比如每1秒调用一次updateCurrentSong()),但优先依赖通知以节省资源。
  • 清理冗余变量:删除原来的全局musicPlayer和songTitle,所有播放状态统一由MusicMonitor管理,避免变量混乱。

内容的提问来源于stack exchange,提问作者Oliemanq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:25:53